Rob*_*wen 6 python sqlalchemy alembic
在 Flask 中,我设置了 SQLAlchemy 以使用根据请求选择的多个数据库,如https://quanttype.net/posts/2016-03-15-flask-sqlalchemy-and-multitenancy.html中所述
因此,SQLAlchemy 配置了 SQLALCHEMY_BINDS,以将传入请求重定向到正确的数据库。
我正在尝试让 Alembic 使用多个数据库。例如。models.py 中的模型在所有数据库中应该相同。
据我所知,alembic multidb仅适用于模型中的bind_key来指定应在哪个数据库中创建哪个表,但我想一次性创建所有数据库中的所有表。我怎么做?
Alembic 提供了一个用于多个数据库的模板:
alembic init --template multidb ./multidb
Run Code Online (Sandbox Code Playgroud)
对于您的特定用例:
1 -alembic.ini使用您的数据库名称和 SQLAlchemy URL进行修改
#alembic.ini
databases = engine1, engine2
[engine1]
sqlalchemy.url = driver://user:pass@localhost/dbname
[engine2]
sqlalchemy.url = driver://user:pass@localhost/dbname2
Run Code Online (Sandbox Code Playgroud)
注意:如果您不想公开密码,请在运行时生成 SQLAlchemy URL env.py。
2 - 全部target_metadata指向multidb/env.py同一模型
# env.py
from models import mymodel
target_metadata = {
"engine1": mymodel.Base.metadata,
"engine2": mymodel.Base.metadata,
}
Run Code Online (Sandbox Code Playgroud)
注意:如果您有很多数据库,可能最好以编程方式执行此操作。
3 - 测试 Alembic 设置
alembic revision --autogenerate -m "test"
Run Code Online (Sandbox Code Playgroud)
您需要确保使用所有数据库凭据执行每个版本的迁移,您可以编写自己的迁移脚本以便一次性完成。
Alembic 提供了一组命令函数 ,可让您以编程方式将 ORM 模型与数据库同步。您可以在脚本中调用command.upgrade(...)and 。command.downgrade(...)
例如,您有 2 个数据库DB1并DB2映射到 中的同一组 ORM 模型models.py,迁移脚本如下所示:
from alembic import command
from alembic.config import Config
cfg = Config(YOUR_ALEMBIC_CFG_FILE_PATH)
# for autogenerate is True, make sure you set correct `target_metadata` in env.py
result = command.revision(config=cfg, message='some msg',
autogenerate=True, rev_id=your_last_rev_id )
# update url with DB1 credential
cfg.set_main_option(name='sqlalchemy.url', value=db1_credential)
command.upgrade(config=cfg, revision=result.revision)
# update url with DB2 credential
cfg.set_main_option(name='sqlalchemy.url', value=db2_credential)
command.upgrade(config=cfg, revision=result.revision)
Run Code Online (Sandbox Code Playgroud)