一句话:😉 虽然不能媲美django的migrate,但是基本功能是够的~~
pythonfrom 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))
pythonflask db init
操作完成之后,会生成migration的文件夹。如果是多个数据库,要使用:flask db init -multidb
flask db migrate -m "Initial migration."
会在migrations的文件下生成迁移文件。最好不要删,因为他会在数据库建立一个表:alembic_version
,用来保存版本,已经生效的迁移文件再删除,会非常费事情。
pythonflask db upgrade
下边是开启了这个参数:render_as_batch=True
场景:在不同的环境,需要配置不同的数据库地址,或者修改相应的参数等等。例如:
pythonfrom 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
flask db check
: 检查migrate 命令是否不会生成任何更改。如果检测到待处理的更改,则命令将退出并显示非零状态代码flask db upgrade
: 执行迁移
flask db downgrade
: 回滚迁移
在迁移执行前后执行某些操作,例如发送通知或执行某些数据处理,可以通过修改 env.py 文件中的 run_migrations_online 函数来实现。
在 env.py 文件中,你可以通过 context.run_migrations() 来指定在执行迁移操作时运行的回调。
pythonfrom 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 ,可以增加相应的回调
flask db history
(flask) eric@EricDeMac ~/program/FlaskProject main ± flask db history 73245b989315 -> 4f9f6d08d9aa (head), famous-product:add update_time <base> -> 73245b989315, test
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
flask db revision
: 创建一个空的versions下的迁移文件,自己可以编写升级或者降级的更改。可以使用 flask db edit
进行编辑。安装:
pip install sqlacodegen==2.3.0
mysql指定导出表命令:
# 指定表 导出 model sqlacodegen mysql+pymysql://user:password@127.0.0.1:3306/dbname --outfile=models.py
只想同步students这张表的数据,执行命令:
pythonsqlacodegen mysql+pymysql://root:123456@localhost:3306/web --outfile=models.py --tables students
本文作者:Eric
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!