编辑
2024-12-06
👷后端架构
00
请注意,本文编写于 195 天前,最后修改于 195 天前,其中某些信息可能已经过时。

目录

用法
配置回调
其他命令的用法
从数据库导出orm对应的model

一句话:😉 虽然不能媲美django的migrate,但是基本功能是够的~~

用法

  1. 注册
python
from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db' db = SQLAlchemy(app) migrate = Migrate(app, db) class User(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(128))
  1. 初始化
python
flask db init

操作完成之后,会生成migration的文件夹。如果是多个数据库,要使用:flask db init -multidb

  1. 增加迁移的备注
flask db migrate -m "Initial migration."

会在migrations的文件下生成迁移文件。最好不要删,因为他会在数据库建立一个表:alembic_version,用来保存版本,已经生效的迁移文件再删除,会非常费事情。

  1. 脚本运行,让数据库生效
python
flask db upgrade

下边是开启了这个参数:render_as_batch=True

image.png

配置回调

场景:在不同的环境,需要配置不同的数据库地址,或者修改相应的参数等等。例如:

python
from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db' # 默认数据库URI db = SQLAlchemy(app) migrate = Migrate(app, db) # 定义配置回调函数 @migrate.configure def configure_alembic(config): # 在此修改或替换 Alembic 配置对象 if app.config['FLASK_ENV'] == 'production': config.set_main_option('sqlalchemy.url', 'mysql://user:password@prod_db/dbname') else: config.set_main_option('sqlalchemy.url', 'sqlite:///example.db') return config

其他命令的用法

  1. flask db check: 检查migrate 命令是否不会生成任何更改。如果检测到待处理的更改,则命令将退出并显示非零状态代码

image.png

  1. flask db upgrade: 执行迁移

  2. flask db downgrade: 回滚迁移

    在迁移执行前后执行某些操作,例如发送通知或执行某些数据处理,可以通过修改 env.py 文件中的 run_migrations_online 函数来实现。

    在 env.py 文件中,你可以通过 context.run_migrations() 来指定在执行迁移操作时运行的回调。

python
from alembic import context from flask import current_app import logging def before_upgrade(context): # 例如,执行升级前的某些操作,如日志记录 current_app.logger.info("Starting database upgrade") def after_upgrade(context): # 例如,执行升级后的操作,如数据同步 current_app.logger.info("Database upgrade completed") def run_migrations_online(): # 设置在执行迁移前后的回调 context.run_migrations = before_upgrade # 执行前的回调 context.run_migrations = after_upgrade # 执行后的回调 # 正常执行迁移 # ...(其余配置)

同理,在使用flask-migrate ,可以增加相应的回调

  1. flask db history
(flask) eric@EricDeMac  ~/program/FlaskProject   main ±  flask db history 73245b989315 -> 4f9f6d08d9aa (head), famous-product:add update_time <base> -> 73245b989315, test
  1. flask db show
(flask) eric@EricDeMac  ~/program/FlaskProject   main ±  flask db show Rev: 4f9f6d08d9aa (head) Parent: 73245b989315 Path: /Users/eric/program/FlaskProject/migrations/versions/4f9f6d08d9aa_famous_product_add_update_time.py famous-product:add update_time Revision ID: 4f9f6d08d9aa Revises: 73245b989315 Create Date: 2024-12-06 18:30:06.825673
  1. flask db revision: 创建一个空的versions下的迁移文件,自己可以编写升级或者降级的更改。可以使用 flask db edit进行编辑。

官方文档

项目示范

从数据库导出orm对应的model

安装:

pip install sqlacodegen==2.3.0

mysql指定导出表命令:

# 指定表 导出 model sqlacodegen mysql+pymysql://user:password@127.0.0.1:3306/dbname --outfile=models.py

只想同步students这张表的数据,执行命令:

python
sqlacodegen mysql+pymysql://root:123456@localhost:3306/web --outfile=models.py --tables students

参考网址

本文作者:Eric

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!