在多个模式中执行 alembic 升级
Perform alembic upgrade in multiple schemas
我正在使用 flask + sqlalchemy + alembic + postgresql,并试图找到一个简单的架构来解决以下问题。
我有一个简单的数据库结构,假设有两个表:
-- 用户
-- 用户项
我的用户在几个不同的域中。我想有几个这样的数据库结构。为此,我在 SQL 中有数据库模式。我使用 sqlalchemy decalrative_base 创建了匹配的 class 结构,最后得到一个未绑定到特定模式的元数据对象。
现在我需要能够 运行 对我创建的每个模式进行 alembic 升级操作(动态)。我可以覆盖 alembic 使用的 target_metadata,但这会干扰当前的 运行ning 进程。
我考虑过克隆元数据,创建一个 "Like metadata1, but with schema 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 每次都正确解析,并且一切顺利
我正在使用 flask + sqlalchemy + alembic + postgresql,并试图找到一个简单的架构来解决以下问题。
我有一个简单的数据库结构,假设有两个表:
-- 用户
-- 用户项
我的用户在几个不同的域中。我想有几个这样的数据库结构。为此,我在 SQL 中有数据库模式。我使用 sqlalchemy decalrative_base 创建了匹配的 class 结构,最后得到一个未绑定到特定模式的元数据对象。
现在我需要能够 运行 对我创建的每个模式进行 alembic 升级操作(动态)。我可以覆盖 alembic 使用的 target_metadata,但这会干扰当前的 运行ning 进程。
我考虑过克隆元数据,创建一个 "Like metadata1, but with schema 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 每次都正确解析,并且一切顺利