知识点: 一、模型迁移python
在Django框架开发过程当中,咱们对数据库字段添加或删除,直接修改模型类,而后进行迁移能够了,很是方便。咱们也想让Flask框架支持这样的操做,就须要使用Flask-Migrate扩展,来实现数据迁移。而且集成到Flask-Script中,全部操做经过命令就能完成。mysql
为了导出数据库迁移命令,Flask-Migrate提供了一个MigrateCommand类,能够附加到flask-script的manager对象上。 先安装下面两个扩展:sql
pip install Flask-Script
复制代码
pip install flask-migrate
复制代码
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import pymysql
from flask_migrate import Migrate, MigrateCommand
from flask_script import Manager
pymysql.install_as_MySQLdb()
app = Flask(__name__)
# 经过脚本管理flask程序
manager = Manager(app)
# 设置链接数据库的URL
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:123456@127.0.0.1:3306/db_flask'
# 设置每次请求结束后会自动提交数据库中的改动
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
# 数据库和模型类同步修改
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
# 查询时会显示原始SQL语句
app.config['SQLALCHEMY_ECHO'] = True
db = SQLAlchemy(app)
# 建立数据库迁移对象
Migrate(app, db)
# 向脚步管理添加数据库迁移命令 db指命令的别名
manager.add_command('db', MigrateCommand)
# 类型
class Type(db.Model):
# 表名
__tablename__ = 'tbl_types'
# 数据库真正存在的字段
id = db.Column(db.Integer, primary_key=True) # 主键
name = db.Column(db.String(32), unique=True) # 名字
# 数据库中不存在的字段,只是为了查找和反向查找。
# backref:在关系的另外一模型中添加反向引用
heros = db.relationship("Hero", backref='type')
def __repr__(self):
return self.name
# 英雄
class Hero(db.Model):
# 表名
__tablename__ = 'tbl_heros'
# 数据库真正存在的字段
id = db.Column(db.Integer, primary_key=True) # 主键
name = db.Column(db.String(64), unique=True) # 名字
gender = db.Column(db.String(64)) # 性别
# 外键 一个射手对应不少英雄
type_id = db.Column(db.Integer, db.ForeignKey("tbl_types.id"))
def __repr__(self):
return self.name
if __name__ == '__main__':
# 0.0.0.0表明任何能表明这台机器的地址均可以访问
# app.run(host='0.0.0.0', port=5000) # 运行程序
manager.run()
复制代码
首先咱们经过命令建立出migrations文件夹,后面全部的迁移文件都会放在这个文件夹里面数据库
python flask_migrate_db.py db init
复制代码
如图所示: flask
下面这条命令跟咱们Django里面的makemigrations同样,是生成迁移文件的做用。由于咱们的模型类并无添加或删除字段,全部第一次会出现没有改变的提示。 -m:给迁移文件加上注释bash
python flask_migrate_db.py db migrate -m 'first create'
复制代码
提示:app
INFO [alembic.runtime.migration] Context impl MySQLImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.env] No changes in schema detected.
复制代码
age = db.Column(db.Integer) # 年龄
复制代码
迁移框架
python flask_migrate_db.py db migrate -m 'add age'
复制代码
迁移文件会生成到migrations文件夹中如图: spa
python flask_migrate_db.py db upgrade
复制代码
咱们在本地数据库查看一下表结构: code
回退数据库时,须要指定回退版本号,因为版本号是随机字符串,为避免出错,建议先使用python flask_migrate_db.py db history命令查看历史版本的具体版本号,而后复制具体版本号执行回退。
python flask_migrate_db.py db downgrade base
复制代码
咱们在本地数据库查看一下表结构:
python flask_migrate_db.py db downgrade 4cee71e47df3
复制代码
在Flask中有了对象模型类迁移的扩展,维护起来表结构,方便了不少。
欢迎关注个人公众号: