flask数据库迁移理解及命令
前言:
- 使用数据库迁移,可以直接建表,而不用我们自己写sql语句用来建表。就是将关系型数据库的一张张表转化成了Python的一个个类。
- 在开发中经常会遇到需要修改原来的数据库模型,修改之后更新数据库,最简单粗暴的方式就是删除旧表,然后在增加新表,这样做的缺点是会造成数据丢失。
- 使用数据库迁移,可以追踪数据库模式的变化,然后把变动应用到数据库中。
- 在flask中使用Flask-Migrate来实现数据库迁移,并且集成到Flask-Script中,所有的操作通过命令来完成。
- 为了导出数据库迁移命令,Flask-Migrate使用了一个MigrateCommand类,可以附加到Flask-Script的manager对象上。
安装Flask-Migrate
pip install flask-migrate
Python代码,用户类和角色类。
#!/usr/bin/python #coding:utf-8 from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_script import Manager from flask_migrate import Migrate,MigrateCommand """ flask_migrate作用: 1、通过命令的方式创建表 2、修改表的结构 """ class Config(object): SQLALCHEMY_DATABASE_URI = "mysql://root:@127.0.0.1:3306/book" # 这个值可以设置,也可以不设置,如果不设置,那么会一直报警告 SQLALCHEMY_TRACK_MODIFICATIONS = False # 这里有个坑,下次再讲。在lask-sqlalchemy 2.0之后就不在需要设置这一项了。 SQLALCHEMY_COMMIT_ON_TEARDOWN = True app = Flask(__name__) app.config.from_object(Config) db = SQLAlchemy(app) manager = Manager(app) # 第一个参数是flask实例,第二个参数SQLAlchemy实例 Migrate(app, db) #manager是Flask-Script的实例,这条语句在flask-Script中添加一个db命令 manager.add_command("db", MigrateCommand) class Role(db.Model): __tablename__ = "roles" id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(128)) title = db.Column(db.String(128)) us = db.relationship("User",backref="role") class User(db.Model): __tablename__="users" id = db.Column(db.Integer,primary_key=True) name = db.Column(db.String(128)) email = db.Column(db.String(128)) password = db.Column(db.String(128)) role_id = db.Column(db.Integer,db.ForeignKey("roles.id")) @app.route("/") def index(): return "index" if __name__ == '__main__': manager.run()
关于config的配置,可以参考flask-Script中文文档
迁移数据库三步走:
第一步:创建迁移仓库
python database.py db init
这里的db是迁移命令的对象,名字可以随便取,但是需要保持一致。
这个命令会创建migrations文件夹,所有迁移文件都放在里面。
这里只是创建了迁移仓库,表还没创建。
可以看到表还没有创建。
第二步:创建迁移脚本
- 自动创建迁移脚本有两个函数
- upgrade():函数把迁移中的改动应用到数据库中。
- downgrade():函数则将改动删除。
- 自动创建的迁移脚本会根据模型定义和数据库当前状态的差异,生成upgrade()和downgrade()函数的内容。
- 对比不一定完全正确,有可能会遗漏一些细节,需要进行检查
python database.py db migrate -m 'initial migration'
"initial migration"是注释
在windows下这里也存在一个坑。
这个坑在这里解释下:
windows系统不支持cmd接收的参数中含有空格,例如我们上面'initial migration',系统收到的是两个参数,所以报错会显示参数过多。
我的解决办法是在两个单词之间加上“_”连接当然方法很多,我这里就使用这种简单粗暴的。
这种情况下,注释会报错。
这样则不会。
运行命令之后,只是在migrations文件夹中新增了数据库迁移的版本文件并没有在数据库也只是创建了版本号,并没有生成对应的表。
第三步:更新数据库
更新数据库命令:
python migrate.py db upgrade
可以看到已经创建表成功了。
如果我们需要讲roles表中的title字段删除,我们再看下版本文件的变化。
删除前:
删除后:
将代码中的title删除,然后再次执行迁移脚本命令
python migrate.py db migrate -m 'del_title'
这个时候数据库中title字段还没有被删除
执行更新数据库操作:
可以看到数据库中,数据被删除。
python migrate.py db upgrade
实际操作顺序: 1.python 文件 db init 2.python 文件 db migrate -m"版本名(注释)" 3.python 文件 db upgrade 然后观察表结构 4.根据需求修改模型 5.python 文件 db migrate -m"新版本名(注释)" 6.python 文件 db upgrade 然后观察表结构 7.若返回版本,则利用 python 文件 db history查看版本号 8.python 文件 db downgrade(upgrade) 版本号
先写这么多,发现写起来,真的有很多内容可以写。待续。。。