本教材由知了传课辛苦制作而成,仅供学习使用,请勿用于商业用途!如进行转载请务必注明出处!谢谢!

Flask-Migrate插件

在实际的开发环境中,经常会发生数据库修改的行为。一般我们修改数据库不会直接手动的去修改,而是去修改ORM对应的模型,然后再把模型映射到数据库中。这时候如果有一个工具能专门做这种事情,就显得非常有用了,而flask-migrate就是做这个事情的。flask-migrate是基于Alembic进行的一个封装,并集成到Flask中,而所有的迁移操作其实都是Alembic做的,他能跟踪模型的变化,并将变化映射到数据库中。

使用Flask-Migrate需要安装,命令如下:

pip install flask-migrate

一、基本用法:

要让Flask-Migrate能够管理app中的数据库,需要使用Migrate(app,db)来绑定app和数据库。假如现在有以下app文件:

from flask import Flask from flask_sqlalchemy import SQLAlchemy from constants import DB_URI from flask_migrate import Migrate app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True db = SQLAlchemy(app) # 绑定app和数据库 migrate = Migrate(app,db) class User(db.Model): id = db.Column(db.Integer,primary_key=True) username = db.Column(db.String(20)) addresses = db.relationship('Address',backref='user') class Address(db.Model): id = db.Column(db.Integer,primary_key=True) email_address = db.Column(db.String(50)) user_id = db.Column(db.Integer,db.ForeignKey('user.id')) db.create_all() @app.route('/') def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run()

之后,就可以在命令行中映射ORM了。首先需要初始化一个迁移文件夹:

flask db init

然后再把当前的模型添加到迁移文件中:

flask db migrate

最后再把迁移文件中对应的数据库操作,真正的映射到数据库中:

flask db upgrade

二、项目重构:

现在是所有代码都写在一个文件中,这样会导致文件会越来越乱。所以进行一下项目重构,设置为以下的目录结构:
migrate.png
以下对各个文件的作用进行解释。

1. constants.py文件:

常量文件,用来存放数据库配置。

# constants.py HOSTNAME = '127.0.0.1' PORT = '3306' DATABASE = 'xt_flask_migrate' USERNAME = 'root' PASSWORD = 'root' DB_URI = 'mysql+mysqldb://{}:{}@{}:{}/{}'.format(USERNAME,PASSWORD,HOSTNAME,PORT,DATABASE)

2. ext.py文件:

db变量放到一个单独的文件,而不是放在主app文件。这样做的目的是为了在大型项目中如果db被多个模型文件引用的话,会造成from your_app import db这样的方式,但是往往也在your_app.py中也会引入模型文件定义的类,这就造成了循环引用。所以最好的办法是把它放在不依赖其他模块的独立文件中。

# ext.py from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy()

3. models.py文件:

模型文件,用来存放所有的模型,并且注意,因为这里使用的是flask-script的方式进行模型和表的映射,因此不需要使用db.create_all()的方式创建数据库。

# models.py from ext import db class User(db.Model): id = db.Column(db.Integer,primary_key=True) username = db.Column(db.String(50)) addresses = db.relationship('Address',backref='user') def __init__(self,username): self.username = username class Address(db.Model): id = db.Column(db.Integer,primary_key=True) email_address = db.Column(db.String(50)) user_id = db.Column(db.Integer,db.ForeignKey('user.id')) def __init__(self,email_address): self.email_address = email_address

4. app.py文件:

这个是主app文件,运行文件。并且因为db被放到另外一个文件中,所以使用db.init_app(app)的方式来绑定数据库。

# app.py from flask import Flask from ext import db app = Flask(__name__) db.init_app(app) @app.route('/') def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run()

三、迁移命令:

通过以上项目重构后,后续我们就只要通过以下三个命令即可完成迁移操作了。

  1. 运行命令来初始化迁移文件:

    flask db init
  2. 运行命令来将模型的映射添加到文件中:

    flask db migrate
  3. 添加将映射文件真正的映射到数据库中:

    flask db upgrade

7661人已阅读,今天你学习了吗?

6条回复
  • einar2022-07-14 01:57:47

    flask : 无法将“flask”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。

  • xinlei19892022-07-21 10:07:48
    @einar 兄弟,你解决了吗?我也是这样

  • yulesslove2022-04-25 06:39:27

    6


  • xu1542022-03-25 07:16:18
    @jammy 或者升级一下python


  • xu1542022-03-25 07:13:26
    @jammy 试试导入一下Deque包

  • jammy2022-02-13 07:33:12

    为啥flask db init 报错出现cannt import Deque?如何解决呀


添加新回复