【问题标题】:alembic + sqlalchemy multiple databasesalembic + sqlalchemy 多个数据库
【发布时间】:2017-04-27 20:20:08
【问题描述】:

在 Flask 中,我设置了 SQLAlchemy 以使用多个数据库,这些数据库根据https://quanttype.net/posts/2016-03-15-flask-sqlalchemy-and-multitenancy.html 中的描述选择多个数据库

所以 SQLAlchemy 配置了 SQLALCHEMY_BINDS 以将传入的请求重定向到正确的数据库。

我正在尝试让 Alembic 使用多个数据库。例如。 models.py 中的模型在所有数据库中应该是相同的。

据我所知,alembic multidb 仅与模型中的 bind_key 一起使用,以指定应在哪个数据库中创建哪个表,但我想一次性在所有数据库中创建所有表。我该怎么做?

【问题讨论】:

    标签: python sqlalchemy alembic


    【解决方案1】:

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

    Alembic 提供a set of command functions 让您以编程方式将您的 ORM 模型与数据库同步。您可以在脚本中调用command.upgrade(...)command.downgrade(...)

    例如,您有 2 个数据库 DB1DB2 映射到 models.py 中的同一组 ORM 模型,迁移脚本如下所示:

    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)
    
    

    【讨论】:

      【解决方案2】:

      Alembic 提供了一个模板来处理多个数据库:

      alembic init --template multidb ./multidb
      

      针对您的特定用例:

      1 - 使用您的数据库名称和 SQLAlchemy URL 修改 alembic.ini

      #alembic.ini
      
      databases = engine1, engine2
      
      [engine1]
      sqlalchemy.url = driver://user:pass@localhost/dbname
      
      [engine2]
      sqlalchemy.url = driver://user:pass@localhost/dbname2
      

      注意:如果您不想公开密码,请在运行时在 env.py 中生成 SQLAlchemy URL。

      2 - 将multidb/env.py 中的所有target_metadata 指向同一模型

      # env.py
      
      from models import mymodel
      
      target_metadata = {
          "engine1": mymodel.Base.metadata,
          "engine2": mymodel.Base.metadata,
      }
      

      注意:如果您有很多数据库,最好以编程方式执行此操作。

      3 - 测试 Alembic 设置

      alembic revision --autogenerate -m "test"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-11-12
        • 1970-01-01
        • 1970-01-01
        • 2016-08-22
        • 1970-01-01
        • 2017-01-08
        • 2023-03-20
        相关资源
        最近更新 更多