Python sqlalchemy、postgresql和卡在其中的关系;“交易中闲置”;

Python sqlalchemy、postgresql和卡在其中的关系;“交易中闲置”;,python,session,transactions,sqlalchemy,Python,Session,Transactions,Sqlalchemy,我有一个与sqlalchemy和postgresql相关的问题 class Profile(Base): ... roles = relationship('Role', secondary=role_profiles, backref='profiles', lazy='dynamic') 运行时(当前用户是配置文件类的实例): 使用sqlalchemy,我在事务中获得了空闲,用于读取postgresql中的配置文件 class Pro

我有一个与sqlalchemy和postgresql相关的问题

class Profile(Base):
  ...

  roles = relationship('Role', secondary=role_profiles,
                       backref='profiles', lazy='dynamic')
运行时(
当前用户
配置文件
类的实例):

使用sqlalchemy,我在事务中获得了
空闲
,用于读取postgresql中的配置文件

class Profile(Base):
  ...

  roles = relationship('Role', secondary=role_profiles,
                       backref='profiles', lazy='dynamic')
编辑:

通过回显查询,我看到每个select都以以下内容开头:

BEGIN (implicit)
另一次编辑:

添加后

pool_size=20, max_overflow=0
对于
create\u引擎
来说,当空闲的数量越来越大时,事务中的
idle
-语句似乎正在回滚。你对此有什么想法吗?这是解决问题的好办法吗


我如何管理这一点,以及如何摆脱选择的
BEGIN

默认情况下,SQLA总是在事务中运行(一些信息)。在web上下文中,大多数框架都会在请求结束时为您处理提交此事务(例如)。如果您没有使用框架,或者这是另一种类型的应用程序,那么您将希望在完成后或在适当的时间提交或回滚


可以配置SQLA,使其不会自动启动事务,但据我所知,这不是它的预期用途,因此您可能会更幸运地不尝试与之抗争:)。

从SQLAlchemy 0.8.2开始,您可以在调用
创建引擎时禁用隐式
开始
语句()

这种变化有一些微妙的含义。首先,在未终止的事务中没有悄悄隐藏的语句将被悄悄忽略

session.execute("DELETE FROM department WHERE department_id=18")
sys.exit(0)
默认值:

自动提交:

其次,更新多个更新不再是自动的,
rollback()

department = Department(u"HR")
session.add(department)
session.flush()
employee = Employee(department.department_id, u'Bob')
session.add(employee)
session.rollback()
默认值:

自动提交:

在引擎对象上设置SQLAlchemy的隔离级别对
许多应用程序。不幸的是,
Session.begin()
并不总是意味着开始事务;

例如,您是否尝试过
pool\u timeout=90
?我发现了它,但我认为这并不能真正解决问题。我想取消选择时开始或选择时自动提交。您没有正确地结束事务。您必须执行
commit
rollback您的事务。
开始
部分是隐式的(如您所述),但需要正确结束。另外:为什么您有一个空的筛选语句?这有意义吗?您是在web上下文中还是在不同的上下文中?最后,尽管高度不推荐,但您可以使用
自动提交
模式(但实际上,不要)@javex,谢谢。我已经读了很多书,从交易中获得了很多,但我仍然无法真正接触到我的
关系中的一些。sqlalchemy是否会自动关闭这些?通常你应该在一个会话上操作。不过,我不明白你在执行
当前用户角色时试图实现的目标。过滤器().all()
。为什么不直接执行
当前用户.roles
?它提供一个列表,并在当前用户所属会话的上下文中自动执行(例如,如果您这样查询:
会话.query(user).filter(user.id==some\u id)。one()
则所有这些都将自动处理。
LOG:  statement: BEGIN
LOG:  statement: show standard_conforming_strings
LOG:  statement: DELETE FROM department WHERE department_id=18
LOG:  unexpected EOF on client connection with an open transaction
LOG:  statement: show standard_conforming_strings
LOG:  statement: DELETE FROM department WHERE department_id=18
department = Department(u"HR")
session.add(department)
session.flush()
employee = Employee(department.department_id, u'Bob')
session.add(employee)
session.rollback()
LOG:  statement: BEGIN
LOG:  statement: INSERT INTO department (name) VALUES ('HR') RETURNING department.department_id
LOG:  statement: ROLLBACK
LOG:  statement: INSERT INTO department (name) VALUES ('HR') RETURNING department.department_id