咱们有了sqlalchemy后,依然不能像django同样愉快的实现python manage.py makemigration/ migrate。对于数据库表结构的改变,sqlalchemy的限制是比较严格的。其实sqlalchemy的做者为咱们提供了解决方案alembic(逻辑相似于git),而flask-migrate经过flask-script模块对alembic进行了进一步的封装。为了实现migrate,天然须要先了解script和alembic两个模块
Flask-Script主要实现的功能是经过命令行的形式来操做Flask。例如python manage.py func1 -u argspython
一般flask-script的manage.py文件为flask文件的入口mysql
from flask_script import Manager from flaskapp import app,DatabaseTable,db manager = Manager(app) # 经过command装饰器实现无参数命令,python manage.py greet @manager.command def greet(): print('你好') # 经过option装饰器实现带参数命令python manage.py -u lala -e la@l.com # -u表明第一个参数的简称,--username是全称, dest 是参数传递的目标形参 @manager.option("-u","--username",dest="username") @manager.option("-e","--email",dest="email") def add_user(username,email): user = DatabaseTable(username=username,email=email) db.session.add(user) db.session.commit()
# manage.py from flask_script import Manager from db_script import db_manager manager = Manager(app) manager.add_command("db",db_manager) # 注册子命令,db为自命令的名称 # db_script.py from flask_script import Manager db_manager = Manager() @db_manager.command def init(): print('迁移仓库建立完毕!') @db_manager.command def revision(): print('迁移脚本生成成功!') @db_manager.command def upgrade(): print('脚本映射到数据库成功!') # 调用python manage.py db init
用来更改数据库结构git
具体迁移步骤:sql
1. 定义好本身的模型
2. 使用alembic建立一个仓库:`alembic init [仓库的名字,推荐使用alembic]`。 模块会建立指定名字的文件夹
3. 修改配置文件:
* 在`alembic.ini`中,给`sqlalchemy.url`设置数据库的链接方式。这个链接方式跟sqlalchemy的方式同样的。
* 在`alembic/env.py`中的`target_metadata`设置模型的`Base.metadata`,要导入`models`。可以使用相对路径:
```python
import sys,os
sys.path.append(os.path.dirname(os.path.dirname(__file__))) # 若是是flask-sqlalchemy用db.Model.metabase
```
4. 将ORM模型生成迁移脚本:`alembic revision --autogenerate -m '想要加的消息'`。 # -m 是消息 。 会根据表结构的更改而自动生成脚本
5. 将生成的脚本映射到数据库中:`alembic upgrade head`。 这一步才更改数据库,head能够是脚本编码,在脚本文件中能找到脚本编码
6. 之后若是修改了模型,重复四、5步骤。数据库
1. init:建立一个alembic仓库。 2. revision:建立一个新的版本文件。 用这个生成了一个脚本。而后用upgrade改 3. --autogenerate:自动将当前模型的修改,生成迁移脚本。 4. -m:本次迁移作了哪些修改,用户能够指定这个参数,方便回顾。 5. upgrade:将指定版本的迁移文件映射到数据库中,会执行版本文件中的upgrade函数。若是有多个迁移脚本没有被映射到数据库中,那么会执行多个迁移脚本。upgrade加版本号就能够了,head指向最新的版本 6. [head]:表明最新的迁移脚本的版本号。 7. downgrade:会执行指定版本的迁移文件中的downgrade函数。 8. heads:展现head指向的脚本文件版本号。 9. history:列出全部的迁移版本及其信息。 10. current:展现当前数据库中的版本号。
flask-migrate对alembic的命令经过flask-script进行了封装django
from flask_script import Manager from zhiliao import app from exts import db from flask_migrate import Migrate,MigrateCommand manager = Manager(app) # 绑定app和db到flask_migrate Migrate(app,db) # 添加Migrate的全部子命令到db子命令下 manager.add_command("db",MigrateCommand) if __name__ == '__main__': manager.run()
1. 初始化一个环境:python manage.py db init 2. 自动检测模型,生成迁移脚本:python manage.py db migrate 3. 将迁移脚本映射到数据库中:python manage.py db upgrade 4. 更多命令:python manage.py db --help
结合sqlalchemy简单实例flask
from flask import Flask import config from exts import db app = Flask(__name__) app.config.from_object(config) db.init_app(app) @app.route('/') def hello_world(): return 'Hello World!' @app.route("/profile/") def profile(): pass if __name__ == '__main__': app.run()
DB_USERNAME = 'root' DB_PASSWORD = 'root' DB_HOST = '127.0.0.1' DB_PORT = '3306' DB_NAME = 'flask_migrate_demo' DB_URI = 'mysql+pymysql://%s:%s@%s:%s/%s?charset=utf8' % (DB_USERNAME,DB_PASSWORD,DB_HOST,DB_PORT,DB_NAME) SQLALCHEMY_DATABASE_URI = DB_URI
# 该文件的目的是为了防止model.py和flaskapp的循环引用 from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy()
from exts import db class User(db.Model): __tablename__ = 'user' id = db.Column(db.Integer,primary_key=True,autoincrement=True) username = db.Column(db.String(50),nullable=False) age = db.Column(db.Integer)
from flask_script import Manager from flaskapp import app from exts import db from flask_migrate import Migrate,MigrateCommand from models import User # 这里必定要导入 manager = Manager(app) Migrate(app,db) manager.add_command("db",MigrateCommand) if __name__ == '__main__': manager.run()