flask-migrate
db.create_all()
方法不能修改表结构,所以我们要想通过修改模型定义修改表结构,就需要Flask-migrate
安装Flask-migrate
pip install Flask-migrate
项目结构
├── app.py
├── config.py
├── exts.py
├── manage.py
├── models.py
├── __pycache__
│ ├── app.cpython-35.pyc
│ ├── config.cpython-35.pyc
│ ├── db_scripts.cpython-35.pyc
│ ├── exts.cpython-35.pyc
│ └── models.cpython-35.pyc
└── templates
├── base.html
├── index.html
└── login.html
manage.py
其他文件不变,manage.py需要做修改
from app import app
from exts import db
from flask_script import Manager
# 导入Migrate, MigrateCommand
# MigrateCommand 包含真正的数据库操作的命令,例如init,migrate,upgrade等等
from flask_migrate import Migrate, MigrateCommand
manager = Manager(app=app)
migrate = Migrate(app, db)
# 导入MigrateCommand命令
manager.add_command('db', MigrateCommand)
@manager.command
def runserver():
print('Server Running.')
if __name__ == '__main__':
manager.run()
测试
初始化migrate环境
(flask-env) F:\Flask Project>python manage.py db init
Creating directory F:\Flask Project\migrations ... done
Creating directory F:\Flask Project\migrations\versions ... done
Generating F:\Flask Project\migrations\alembic.ini ... done
Generating F:\Flask Project\migrations\env.py ... done
Generating F:\Flask Project\migrations\README ... done
Generating F:\Flask Project\migrations\script.py.mako ... done
Please edit configuration/connection/logging settings in 'F:\\Flask Project\\migrations\\alembic.ini' before proceeding.
生成更新迁移脚本
(flask-env) F:\Flask Project>python manage.py db migrate
INFO [alembic.runtime.migration] Context impl MySQLImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.autogenerate.compare] Detected added table 'article'
INFO [alembic.autogenerate.compare] Detected added table 't1'
INFO [alembic.autogenerate.compare] Detected added table 'tag'
INFO [alembic.autogenerate.compare] Detected added table 'article_tag' Generating F:\Flask Project\migrations\versions\7c1c9f6b1cd6_.py ... done
生成的迁移脚本中有两个关键函数upgrade()和downgrade(),upgrade就是即将要执行的函数,downgrade估计就是回滚脚本
更新迁移数据库
执行更新迁移脚本
(flask-env) F:\Flask Project>python manage.py db upgrade
INFO [alembic.runtime.migration] Context impl MySQLImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.runtime.migration] Running upgrade -> 7c1c9f6b1cd6, empty message
检查数据库表结构
mysql> show tables;