如何为Flask的Alembic迁移与SQLAlchemy配置不同SQL登录?
解决Flask应用与Alembic迁移使用不同数据库账号的问题
核心思路
通过拆分环境变量并配置逻辑分支,让Alembic迁移时使用app_owner账号,Flask应用运行时使用app_rw账号,具体实现分以下几步:
1. 新增两个数据库连接环境变量
在Docker部署配置(如docker-compose.yml或环境变量文件)中,添加两个独立的连接字符串:
DATABASE_URL_RW:对应app_rw账号的连接串,格式示例:postgresql://app_rw:password@db-host:5432/your-dbDATABASE_URL_OWNER:对应app_owner账号的连接串,格式示例:postgresql://app_owner:password@db-host:5432/your-db
2. 配置Flask应用使用app_rw账号
在Flask的create_app函数中,直接读取DATABASE_URL_RW作为应用的数据库连接:
import os from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate db = SQLAlchemy() migrate = Migrate() def create_app(): app = Flask(__name__) # 应用运行时使用app_rw账号 app.config['SQLALCHEMY_DATABASE_URI'] = os.getenv('DATABASE_URL_RW') # 关闭不必要的修改追踪(可选优化) app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db.init_app(app) migrate.init_app(app, db) # 注册蓝图、添加路由等业务逻辑... return app
3. 让Alembic迁移使用app_owner账号
有两种实现方式,选其一即可:
方式一:临时切换环境变量(简单直接)
修改Docker入口脚本,在执行迁移时临时将DATABASE_URL替换为app_owner的连接串,迁移完成后再切回app_rw:
# 用app_owner账号执行数据库迁移 export DATABASE_URL=$DATABASE_URL_OWNER flask db upgrade head # 切换回app_rw账号启动应用 export DATABASE_URL=$DATABASE_URL_RW gunicorn -w 4 -b 0.0.0.0:5000 'app:create_app()'
注:如果你的Alembic配置(
alembic.ini)中sqlalchemy.url是通过%(DATABASE_URL)s读取环境变量,这种方式会自动生效。
方式二:通过Flask配置动态切换(更灵活)
在create_app中添加迁移模式判断,当执行迁移时自动使用app_owner账号:
def create_app(): app = Flask(__name__) # 判断是否处于迁移模式 if os.getenv('FLASK_MIGRATE_MODE') == 'true': # 迁移时使用app_owner账号 app.config['SQLALCHEMY_DATABASE_URI'] = os.getenv('DATABASE_URL_OWNER') else: # 正常运行时使用app_rw账号 app.config['SQLALCHEMY_DATABASE_URI'] = os.getenv('DATABASE_URL_RW') # 其他配置初始化... db.init_app(app) migrate.init_app(app, db) return app
然后修改Docker脚本:
# 开启迁移模式,执行数据库升级 export FLASK_MIGRATE_MODE=true flask db upgrade head # 关闭迁移模式,启动应用 unset FLASK_MIGRATE_MODE gunicorn -w 4 -b 0.0.0.0:5000 'app:create_app()'
内容的提问来源于stack exchange,提问作者mcnnowak
相关产品推荐
相关产品推荐

