manager.py代碼如下:
from flask_script import Manager, Shell, Server
from flask_migrate import Migrate, MigrateCommand
from app.ext import db
from app import create_app
app = create_app()
manager = Manager(app=app)
migrate = Migrate(app, db)
def make_shell_context():
return dict(app=app)
manager.add_command("shell", Shell(make_context=make_shell_context))
manager.add_command("run_dev", Server(use_debugger=True, use_reloader=True))
manager.add_command("runserver", Server())
manager.add_command("db", MigrateCommand)
@manager.command
def deploy():
"""run deployment tasks"""
pass
if __name__ == "__main__":
manager.run(default_command="runserver")
執行python manager.py db 查看參數說明
@MacBook-Pro-2 Garen % python manager.py db
usage: Perform database migrations
Perform database migrations
positional arguments:
{init,revision,migrate,edit,merge,upgrade,downgrade,show,history,heads,branches,current,stamp}
init Creates a new migration repository
revision Create a new revision file.
migrate Alias for 'revision --autogenerate'
edit Edit current revision.
merge Merge two revisions together. Creates a new migration
file
upgrade Upgrade to a later version
downgrade Revert to a previous version
show Show the revision denoted by the given symbol.
history List changeset scripts in chronological order.
heads Show current available heads in the script directory
branches Show current branch points
current Display the current revision for each database.
stamp 'stamp' the revision table with the given revision;
don't run any migrations
創建數據庫操作
- 初始化數據庫
init命令會創建一個新的版本倉庫,並且會生成migrations文件夾.這點類似django.
(Garen) zhouwanghua@MacBook-Pro-2 Garen % python manager.py db init
Creating directory /Users/zhouwanghua/Code/Garen/migrations ... done
Creating directory /Users/zhouwanghua/Code/Garen/migrations/versions ... done
Generating /Users/zhouwanghua/Code/Garen/migrations/script.py.mako ... done
Generating /Users/zhouwanghua/Code/Garen/migrations/env.py ... done
Generating /Users/zhouwanghua/Code/Garen/migrations/README ... done
Generating /Users/zhouwanghua/Code/Garen/migrations/alembic.ini ... done
Please edit configuration/connection/logging settings in '/Users/zhouwanghua/Code/Garen/migrations/alembic.ini'
before proceeding.
- 創建version表
執行upgrade之後會在數據中創建一個alembic_version表
(Garen) zhouwanghua@MacBook-Pro-2 Garen % python manager.py db upgrade
INFO [alembic.runtime.migration] Context impl MySQLImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
- 生成models對象的遷移腳本
如果有新的表或字段改動都需要使用這個命令,類似django的makemigrations
(Garen) zhouwanghua@MacBook-Pro-2 Garen % python manager.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 'reply'
Generating /Users/zhouwanghua/Code/Garen/migrations/versions/d5e95964b986_.py ... done
- 在執行遷移命令upgrade
執行遷移腳本,創建/維護表
(Garen) zhouwanghua@MacBook-Pro-2 Garen % python manager.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 -> d5e95964b986, empty message
總結:
flask-migrate與django自帶的orm的理念是一樣的.migrate == django的makemigrations upgrade==django的migrate