【问题标题】:Perform alembic upgrade in multiple schemas在多个模式中执行 alembic 升级
【发布时间】:2015-03-31 14:17:25
【问题描述】:

我正在使用flask + sqlalchemy + alembic + postgresql,并试图找到一个简单的架构来解决以下问题。

我有一个简单的数据库结构,假设有两个表:

-- 用户

-- 用户项

我的用户位于多个不同的域中。我想有几个这样的数据库结构。为此,我在 SQL 中有数据库模式。我使用 sqlalchemy decalrative_base 创建了匹配的类结构,并最终得到了一个未绑定到特定架构的 MetaData 对象。

现在我需要能够对我创建的每个架构(动态地)运行 alembic 的升级操作。我可以覆盖 alembic 使用的 target_metadata,但这会干扰当前正在运行的进程。

我想过克隆元数据,创建一个“像元数据1,但使用模式 XYZ”并将其提供给 alembic,但我没有找到这样做的方法。

克隆元数据和修改所有表的架构是否正确?有没有简单的方法来做到这一点?

是否有其他方法可以对同一数据库中的多个模式应用 alembic 操作?

谢谢

【问题讨论】:

    标签: python postgresql flask sqlalchemy alembic


    【解决方案1】:

    我们最终做的是使用 sqlalchemy 的事件机制在查询被执行之前捕获它们并添加一个前缀来改变架构:

    def before_cursor_execute(conn, cursor, statement, parameters, context, executemany):
        schema_name = <Logic to resolve schema name>
        statement = "SET search_path TO '%s'; %s" % (schema_name, statement)
        return statement, parameters
        ......
        (later in the code)
        listen(Engine, 'before_cursor_execute', before_cursor_execute, retval=True)
    

    这样,我们可以多次运行alembic的migrate,确保每次都正确解析schema_name,一切顺利

    【讨论】:

      猜你喜欢
      • 2019-12-11
      • 2014-08-28
      • 2014-04-01
      • 2019-08-14
      • 2020-12-22
      • 2020-12-06
      相关资源
      最近更新 更多