数据库迁移
在 Flask 中可以使用 Flask-Migrate 扩展, 来实现数据迁移. 并且集成到 Flask-Script 中, 所有操作通过命令就能完成.
为了导出数据库迁移命令, Flask-Migrate 提供了一个 MigrateCommand 类, 可以附加到 flask-script 的 manager 对象上.
创建迁移仓库
python3 database.py db init
创建迁移脚本
自动创建迁移脚本有两个函数
upgrade(): 函数把迁移中的改动应用到数据库中.
downgrade(): 函数则将改动删除.
自动创建的迁移脚本会根据模型定义和数据库当前状态的差异, 生成 upgrade() 和 downgrade() 函数的内容.
对比不一定完全正确, 有可能会遗漏一些细节, 需要进行检查
python3 database.py db migrate -m 'initial migration'
更新数据库
- # 更新
- python3 database.py db upgrade
- # 查看历史版本
- python app.py db history
- # 回退
python3 app.py db downgrade 版本号
- '''
- 实际操作顺序:
- 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) 版本号
- '''
- from flask import Flask
- from flask_sqlalchemy import SQLAlchemy
- from flask_migrate import MigrateCommand, Migrate
- from flask_script import Manager
- '''
- MigrateCommand: 迁移命令
- 第一步初始化: python3 demo6_数据库迁移. py db init
- 第二步生成迁移版本文件: python3 demo6_数据库迁移. py db migrate -m'initial_01'
- 第三步执行迁移: python3 demo6_数据库迁移. py db upgrade|downgrade
- '''
- app = Flask(__name__)
- #设置连接数据库的 URL
- app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1:3306/migratetest'
- app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
- db = SQLAlchemy(app)
- # 一, 迁移初始化, 第一个参数是 flask 实例, 第二个参数是数据库实例
- Migrate(app, db)
- # 二, 实例终端命令执行对象
- manager = Manager(app)
- # 三, 为 manager 添加迁移命令
- manager.add_command('db', MigrateCommand)
- # 创建数据表模型 ---- 实例化后就是指向数据表中的一条记录
- class Role(db.Model):
- # 定义表名
- __tablename__ = 'roles'
- # 定义列对象
- id = db.Column(db.Integer, primary_key=True)
- nike_name = db.Column(db.String(64), unique=True) # 修改字段名
- age = db.Column(db.Integer, nullable=True) # 新增字段
- # height = db.Column(db.Integer) # 新增字段, 删除此字段
- user = db.relationship('User', backref='role')
- #repr() 方法显示一个可读字符串
- def __repr__(self):
- return 'Role:%s'% self.name
- class User(db.Model):
- __tablename__ = 'users'
- id = db.Column(db.Integer, primary_key=True)
- name = db.Column(db.String(64), unique=True, index=True)
- email = db.Column(db.String(64),unique=True)
- password = db.Column(db.String(64))
- role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
- def __repr__(self):
- return 'User:%s'%self.name
- @app.route('/')
- def index():
- return "hello world"
- if __name__ == '__main__':
- manager.run()
来源: http://www.bubuko.com/infodetail-2733169.html