python全栈028—–flask-migrate,init_app(),不删除添加列,添加数据

Flask-migrate

在实际的开发环境中,经常会发生数据库修改的行为。一般我们修改数据库不会直接手动的去修改,而是去修改ORM对应的模型,然后再把模型映射到数据库中。这时候如果有一个工具能专门做这种事情,就显得非常有用了,而flask-migrate就是做这个事情的。

flask-migrate是基于Alembic进行的一个封装,并集成到Flask中,而所有的迁移操作其实都是Alembic做的,他能跟踪模型的变化,并将变化映射到数据库中。

  • 使用前需要安装flask-migrate

  • 实际运用
  • 创建一个文件夹project,在文件夹中创建两个py文件
1
2
3
4
5
6
7
8
9
10
config.py文件
HOSTNAME = '127.0.0.1'
DATABASE = 'demo'
PORT = 3306
USERNAME = 'root'
PASSWORD = 'root'
DB_URL = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNAME,PASSWORD,HOSTNAME,PORT,DATABASE)

SQLALCHEMY_DATABASE_URI = DB_URL
SQLALCHEMY_TRACK_MODIFICATIONS = False
1
2
3
4
5
6
7
8
9
10
11
12
flask_app.py文件
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

@app.route('/')
def index():
    return '这是首页'

if __name__ =='__mian__':
    app.run(debug=True)
  • 然后我们在flask_app文件中倒入config文件,并且加载配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
#倒入配置文件
import config

app = Flask(__name__)
#加载配置文件
app.config.from_object(config)  

@app.route('/')
def index():
    return '这是首页'

if __name__ =='__mian__':
    app.run(debug=True)
  • 在创建一个models.py文件存放模型
1
2
3
4
5
6
7
8
9
10
11
#从上面的flask_app(view文件)中倒入db
from flask_app import db

class User(db.Model):
    __tablename__ = 'project_user'

    id = db.Column(db.Integer,primary_key = True,autoincrement = True)
    name = db.Column(db.String(50))
    email = db.Column(db.String(50))
    password = db.Column(db.String(50))
db.create_all()

  • 我们尝试一下添加数据然后运行代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import config
#导入User
from models import User


app = Flask(__name__)
app.config.from_object(config)

db = SQLAlchemy(app)
#添加数据
user = User(name='zaaaacki',email = '[email protected]',password = '123456')
db.session.add(user)
db.session.commit()

@app.route('/')
def index():
    return '这是首页'

if __name__ =='__mian__':
    app.run(debug=True)
  • 这样会报错给我们,因为这两个文件往复运作,互相导入,导致出错,
  • 那么我们再添加一个文件呢
  • 再创建一个asd.py文件
1
2
3
4
asd.py
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()
  • 在asd文件中创建我们使用的db,既然我们创建好了db,那么我们就不从flask_app文件中倒入了,直接从asd文件中倒入db

这里把flask_app 修改为asd

  • 我们的view视图里面还需要倒入我们新创建的db

但是现在又出现了一个问题,我们创建的db没有app和flask关联,怎么呢

  • 我们通过init_app方法来给db传入app属性

  • 我们解决掉了循环导入的问题,现在我们需要映射数据库了,用到migrate
  • 穿件一个manage.py文件
  • 导入库
1
2
3
4
from flask_script import Manager
from flask_migrate import Migrate,MigrateCommand
from asd import db
from flask_app import app
  • 接下来需要映射那个模型到数据库,我们就导入那个
1
2
3
4
5
6
7
8
9
#创建实例和app绑定
manage = Manager(app)
把app和db倒入进来让他们与flask产生联系
Migrate(app,db)
调用方法,映射数据库
manage.add_command('db',MigrateCommand)

if __name__ =='__main__':
    manage.run()
  • 我们现在去命令行中进行操作
  • 首先我们要初始化

  • 接下来进行文件的迁移

  • 打开数据库发现多了一个表格他是用来存放我们的版本信息的
  • 我们可以看到pycharm中生成了一个迁移文件
  • 这是一个版本号,我们加下来要把这个版本号成功的放入到我们的数据库中,就算迁移成功
  • 然后输出这个
  • 但是我在这里出现了一个问题

  • 后来查资料发现应该这么解决

在db.inti_app前加一个ad.app=app

  • 再在命令行中输入刚才的代码
  • 运行成功后打开数据库可以发现我们表格创建成功

  • 并且版本号也添加成功

  • 但是我们这么复杂的操作有啥用呢
  • 我们在表格中在添加一个age列

  • 我们不删除表格,我们进入到命令行操作,进行一次迁移

  • 输入两段代码
  • 然后打开数据库发现添加了age字段

  • migrate的作用就显示出来了,我们不用删除表格就添加了age列
  • 现在我们是不能直接添加数据的,会报错的
  • 那么我们怎么添加数据
  • 我们要在manage文件中使用option装饰器,添加我们需要的数据

  • 然后再命令行处输入

  • 打开数据库发现数据添加成功