在多个模式中执行alembic升级

时间:2015-02-01 15:04:54

标签: python postgresql flask sqlalchemy alembic

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

我有一个简单的数据库结构,比方说两个表:

- 用户

- UserItems

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

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

我考虑过克隆元数据,创建一个“Like metadata1,但是使用模式XYZ”并将其提供给alembic,但是我找不到这样做的方法。

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

是否有不同的方法在同一数据库中的多个模式上应用alembic操作?

由于

1 个答案:

答案 0 :(得分: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的迁移,确保每次都能正确解析schema_name,并且一切运行顺利