flask-migrate是flask的一个扩展模块,主要是扩展数据库表结构的.类似于Django的python manage.py migrate
官方文档: http://flask-migrate.readthedocs.io/en/latest/
安装
pip install flask-migrate
使用举例
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
db = SQLAlchemy(app)
migrate = Migrate(app, db) # 后续可有db 命令
manager = Manager(app)
manager.add_command('db', MigrateCommand)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(128))
if __name__ == '__main__':
manager.run()
执行命令
# 初始化数据库,会创建一个migations文件夹,并且会在数据库中生成一个alembic_version表 $ python manage.py db init # 在migrations下生成一个version文件夹,下面包含了对应版本的数据库操作py脚本。 # 由于migrate并不一定全部发现你对model的所有改动,因此生成的py脚本需要review, 有错的话则需要edit。 # 例如目前知道的,表名称表更,列名称变更,或给constraints命名等,migreate都不能发现的。更多限制细节见此:Alembic autogenerate documentation $ python manage.py db migrate # 创建迁移历史 # 最后一步。此命令相当于执行了version文件夹下的相应py版本,对数据库进行变更操作。 # 此后,对model有变更,只要重复migrate和upgrade操作即可。 $ python manage.py db upgrade # 更新数据库
坑
1.设计表时字段的默认值
operator = db.Column(db.String(40), nullable=True, server_default="init_data")
这里用参数server_default,而不是default
2.如果报这个错误
Heroku Postgres, db migrate fail: alembic.util.exc.CommandError: Can't locate revision identified by
将alembic_version表中的数据删掉即可