python - 在多个模式中执行 alembic 升级

标签 python postgresql flask sqlalchemy alembic

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

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

-- 用户

-- 用户项

我的用户在几个不同的域中。我想有几个这样的数据库结构。为此,我在 SQL 中有数据库模式。我使用 sqlalchemy decalrative_base 创建了匹配的类结构,并以未绑定(bind)到特定模式的元数据对象结束。

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

我考虑过克隆元数据,创建一个“类似元数据 1,但具有 XYZ 架构”并将其提供给 alembic,但我没有找到执行此操作的方法。

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

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

谢谢

最佳答案

我们最终做的是使用 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,并且一切顺利

关于python - 在多个模式中执行 alembic 升级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28264125/

相关文章:

python - Flask 自动转义具有不常见扩展名的文件

python - 在 Python/Tornado 中返回(传递)函数调用?

sql - 如何将前向填充作为 PL/PGSQL 函数

java - 延迟初始化: failed to lazily initialize a collection

java - Hibernate+PostgreSQL 抛出JDBCConnectionException : Cannot open connection

python - 使用棉花糖模式过滤 sqlalchemy 表更新

python - 如何将参数传递给已经运行的 python 程序?

python - Django翻译和py2exe

python - 是什么导致 Python 错误 'bad escape\C'?

Python Shell 不工作,不运行解释器 (Flask)