flask连接数据库(2)——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

二、项目重构:
现在是所有代码都写在一个文件中,这样会导致文件会越来越乱。所以进行一下项目重构,设置为以下的目录结构:请添加图片描述
以下对各个文件的作用进行解释。

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()

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

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

        flask db init
        

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

        flask db migrate
        

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

        flask db upgrade
        评论
        添加红包

        请填写红包祝福语或标题

        红包个数最小为10个

        红包金额最低5元

        当前余额3.43前往充值 >
        需支付:10.00
        成就一亿技术人!
        领取后你会自动成为博主和红包主的粉丝 规则
        hope_wisdom
        发出的红包
        实付
        使用余额支付
        点击重新获取
        扫码支付
        钱包余额 0

        抵扣说明:

        1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
        2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

        余额充值