flask-migrate可以十分方便的进行数据库的迁移与映射,将我们修改过的ORM模型映射到数据库中。另外flask-migrate是对Alembic的一个封装,其实它的底层是交由Alembic来处理的。使用起来十分方便。

在flask项目中使用flask-migrate,我采用下面的结构。

 

目录结构

.
|-- app.py     入口程序
|-- config.py  全局配置
|-- ext.py      对数据库的声明单独放在一个文件
|-- manage.py    迁移脚本
|-- migrations     执行迁移过程,产生的映射文件(不必关心)
|-- models.py     ORM模型构造
|-- static             ....
|-- templates      ......
`-- venv             虚拟环境(不必关心)

 

 

代码组织详解

1.app.py

项目代码的入口,完成主要的配置和开始运行。

#app.py
from flask import Flask
from ext import db
import config
#目的:练习Flask-Migrate模块的使用
#安装依赖:  pip install flask-migrate
#其他依赖:
            #pip install pymysql
            #pip install SQLAlchemy
            #pip install flask-sqlalchemy
            #pip install flask-script

#迁移命令
# 1.python manage.py db init
# 2.python manage.py db migrate
# 3.python manage.py db upgrade

def create_app():
    app = Flask(__name__)
    app.config.from_object(config)      #载入config.py中的配置信息

    db.init_app(app)  # app绑定数据库db

    return app


if __name__ == '__main__':
    app = create_app()
    app.run()

 

2.ext.py

为了避免一些外部模块和app.py之间的循环引用,对此将数据库db的声明单独放置一个文件中。

#ext.py
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()       #创建一个数据库引擎

 

3.config.py

用来存放一些全局的配置信息,一般是非常非常重要的配置信息。

#数据库配置信息
HOSTNAME = '127.0.0.1'
PORT     = '3306'
DATABASE = 'mydb'
USERNAME = 'root'
PASSWORD = 'wangjian'
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNAME,PASSWORD,HOSTNAME,PORT,DATABASE)

SQLALCHEMY_DATABASE_URI = DB_URI
SQLALCHEMY_TRACK_MODIFICATIONS = True

 

4.models.py

用来构造ORM模型,这个是对数据库表格的映射。后面迁移过程会使用到。

# models.py
from ext import db

#创建ORM模型类
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

 

5.manage.py

本文的重点,将flask-migrate迁移的操作以脚本命令的形式添加到`db`这个子集

# manage.py
#将迁移相关的命令集添加到脚本命令中

from flask_migrate import Migrate, MigrateCommand
from ext import db
from flask_script import Manager
from app import create_app
import models               #导入你想要迁移的数据表的ORM类

app = create_app()      #实例化一个app对象

manager = Manager(app)  #实例化一个manager对象

Migrate(app,db)    #绑定 数据库与app,建立关系

manager.add_command('db',MigrateCommand)    #添加迁移命令集 到脚本命令


#如果是以此脚本作为主脚本程序,就执行
if __name__ == '__main__':
    manager.run()

 

迁移动作

在项目目录下,进入控制台输入命令


1.初始化迁移文件

python manage.py db init


2.将模型添加到迁移文件

python manage.py db migrate


3.迁移文件中的模型映射到数据库中

python manage.py db upgrade

 

观察数据库

sucess!!