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;

results matching ""

    No results matching ""