SQLAlchemy 连接如何与基于会话的事务相关?

jav*_*vex 1 python postgresql sqlalchemy zope

我目前正在开发一个新的 Web 应用程序,该应用程序需要在向应用程序本身提供会话之前执行 SQL 语句。

详细信息:我正在运行具有多个模式的 PostgreSQL 数据库服务器,我需要SET search_path在应用程序使用会话之前执行一条语句。我还使用ZopeTransactionExtension在请求级别自动处理事务。

为了保证SQL语句的执行,似乎有两种可能的方法:

由于我使用的是作用域会话并希望保持事务完整,我想知道这些方式中的哪一种可能会干扰事务管理。

例如,引擎是否在每次查询时从池中分发一个新连接?或者它是否在其生命周期内附加到会话,即直到请求被处理并且会话和事务被关闭/提交?

另一方面,由于我使用的是范围会话,我可以按照 zzzeek 在第二个链接中建议的方式执行它吗?也就是说,一旦事务结束,上下文是否会被保留并自动重置?

我是否可能缺少第三种方式?

zzz*_*eek 5

例如,引擎是否在每次查询时从池中分配一个新连接?

仅当您设置 autocommit=True 时,情况不应该如此。

或者它是否在其生命周期内附加到会话,即直到请求被处理并且会话和事务被关闭/提交?

每笔交易都会附上它。但是 Postgresql 中的“search_path”是每个 postgresql 会话(不要与 SQLAlchemy 会话混淆)——它基本上是连接本身的生命周期。

现在的会话(以及引擎和池)有大量的事件挂钩,您可以抓住它们来设置这样的状态。如果你想坚持会话,你可以尝试after_begin