Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在多个架构中执行alembic升级_Python_Postgresql_Flask_Sqlalchemy_Alembic - Fatal编程技术网

Python 在多个架构中执行alembic升级

Python 在多个架构中执行alembic升级,python,postgresql,flask,sqlalchemy,alembic,Python,Postgresql,Flask,Sqlalchemy,Alembic,我正在使用flask+sqlalchemy+alembic+postgresql,并试图找到一个简单的体系结构来解决以下问题 我有一个简单的数据库结构,假设有两个表: --使用者 --用户项 我的用户在几个不同的领域。我想有几个这样的数据库结构。为此,我使用SQL中的数据库模式。我使用sqlalchemy degrative_base创建了匹配的类结构,最终得到了一个未绑定到特定模式的元数据对象 现在,我需要能够在我创建的每个模式上运行alembic的升级操作(动态)。我可以覆盖alembic使

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

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

--使用者

--用户项

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

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

我考虑过克隆元数据,创建一个“类似metadata1,但使用模式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)
def before\u cursor\u execute(连接、游标、语句、参数、上下文、executemany):
架构名称=
statement=“将搜索路径设置为“%s”;%s%”(架构名称,语句)
返回语句、参数
......
(代码后面部分)
侦听(引擎“在光标执行之前”,在光标执行之前,retval=True)
通过这种方式,我们可以多次运行alembic的migrate,确保每次正确解析schema_名称,并且一切都顺利进行