Migrate 简介
Migrate 类似于 Django 中的 manager.py 的 migrate,它的作用是将我们写好的 ORM 类对象,迁移到数据库中
数据库迁移操作顺序
-
python 文件 db init
-
根据需求修改模型
-
python flaskapp文件 db migrate -m"新版本名(注释)"
-
python flaskapp文件 db upgrade 然后观察表结构
-
若返回版本,则利用 python 文件 db history查看版本号
-
python 文件 db downgrade(upgrade) 版本号
编写 ORM 对象
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate,MigrateCommand
from flask_script import Manager
app = Flask(__name__)
manager = Manager(app)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+mysqldb://root:makemoney@127.0.0.1:3306/flask_demo'
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = SQLAlchemy(app)
# 第一个参数是Flask的实例,第二个参数是Sqlalchemy数据库实例
migrate = Migrate(app,db)
# manager是Flask-Script的实例,这条语句在flask-Script中添加一个db命令
manager.add_command('db',MigrateCommand)
# 定义模型Role
class Role(db.Model):
# 定义表名
__tablename__ = 'roles'
# 定义列对象
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String(64),unique=True)
user = db.relationship('User',backref='role')
# repr()方法显示一个可读字符串,
def __repr__(self):
return 'Role:'.format(self.name)
# 定义用户
class User(db.Model):
__talbe__ = 'users'
id = db.Column(db.Integer,primary_key=True)
username = db.Column(db.String(64),unique=True,index=True)
# 设置外键
role_id = db.Column(db.Integer,db.ForeignKey('roles.id'))
def __repr__(self):
return 'User:'.format(self.username)
if __name__ == '__main__':
manager.run()
创建迁移仓库
python manager.py db init
创建迁移脚本
自动创建迁移脚本有两个函数
upgrade()
:函数把迁移中的改动应用到数据库中
downgrade()
:函数则将改动删除
自动创建的迁移脚本会根据模型定义和数据库当前状态的差异,生成 upgrade()
和 downgrade()
函数的内容
对比不一定完全正确,有可能会遗漏一些细节,需要进行检查
python manager.py db migrate
更新数据库
python manager.py db upgrade
返回以前的版本
可以根据 history 命令找到版本号,然后传给downgrade命令:
python app.py db history
输出格式:<base> -> 版本号 (head),initial migration
回滚到指定版本
python app.py db downgrade 版本号
参考文章:https://www.cnblogs.com/sablier/p/11084080.html#283342143
原文地址:https://blog.csdn.net/yilovexing
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。