alembic + sqlalchemy 多个数据库

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来指定应在哪个数据库中创建哪个表,但我想一次性创建所有数据库中的所有表。我怎么做?

swi*_*mer 5

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)


Han*_*Han 1

您需要确保使用所有数据库凭据执行每个版本的迁移,您可以编写自己的迁移脚本以便一次性完成。

Alembic 提供了一组命令函数 ,可让您以编程方式将 ORM 模型与数据库同步。您可以在脚本中调用command.upgrade(...)and 。command.downgrade(...)

例如,您有 2 个数据库DB1DB2映射到 中的同一组 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)