Flask Migrate 数据库版本控制
2020-02-01 本文已影响0人
友仁恒敬
在开发中,由于需求变化,经常要变换表结构,手动更新十分不变,且项目一大后,不容易管理,通过数据库的版本控制,可以方便管理。这是flask migrate的作用。
1 安装 pip install flask_migrate flask_script
2 代码结构
migrate.py # migrate 主程序
config.py # app 配置参数
models/user.py # user表
/post.py # post 表
exts/db.py # flask SQLAlchemy, 便于模块化,所以独立放在在exts目录下
3 代码说明
- migrate.py
from flask import Flask
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
from exts.db import db
from config import Config
app = Flask(__name__)
app.config.from_object(Config)
db.init_app(app)
# 初始化 migrate
# 两个参数一个是 Flask 的 app,一个是数据库 db
migrate = Migrate(app, db)
# 初始化管理器
manager = Manager(app)
# 添加 db 命令,并与 MigrateCommand 绑定
manager.add_command('db', MigrateCommand)
# 导入model
from models.user import User
# 打开注释,重新migrate,查看效果
#from models.post import Post
if __name__ == '__main__':
manager.run()
config.py
import os
class Config(object):
BASE_DIR = os.path.abspath(os.path.dirname(__file__))
SECRET_KEY = os.environ.get('SECRET_KEY') or 'you#will#never#guess'
MYSQL = 'mysql+mysqldb://dev:12345@localhost:3306/test' # dialect client pymysql,mysqldb
JSON_AS_ASCII = False # return chinese unicode to show readable words.
SQLALCHEMY_BINDS = {
"test": MYSQL,
}
SQLALCHEMY_DATABASE_URI = MYSQL # 默认db session dialect
SQLALCHEMY_TRACK_MODIFICATIONS = False
SQLALCHEMY_POOL_RECYCLE = 299 # db 失效时间
user.py
from exts.db import db
class User(db.Model):
__bind_key__ = 'test'
__tablename__='user'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(128))
#avatar = db.Column(db.String(128)) # 打开注释后,运行migrate后看效果
#gender = db.Column(db.Boolean) # 同上
post.py
from exts.db import db
class Post(db.Model):
__bind_key__ = 'test'
__tablename__= 'post'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(128))
5 运行migrate命令
1. python migrate.py db init # 初始化版本库
2. python migrate.py db migrate -m '第一个版本'
3. python migrate.py db upgrade # 提交版本
4. 修改models中的属性,再重复2和3
5. python migrate.py db downgrade # 回退版本
可以看到很方便的控制model的更新