sqlalchemy,postgresql和关系陷入“闲置交易”

时间:2013-08-26 06:56:06

标签: python session transactions sqlalchemy

我遇到了与sqlalchemy和postgresql相关的问题。

class Profile(Base):
  ...

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

运行时(current_userProfile类的实例):

roles = current_user.roles.filter().all()

使用sqlalchemy我获取idle in transaction所有选择,以便在postgresql中读取配置文件。

修改

从回显查询中我看到每个选择都以:

开头
BEGIN (implicit)

另一个编辑:

添加

pool_size=20, max_overflow=0

create_engine似乎idle in transaction - 语句在空闲数量变大时回滚。对此有任何想法,这对问题是否是一个糟糕的解决方案?

我如何管理这个以及如何摆脱选择的BEGIN

2 个答案:

答案 0 :(得分:4)

从SQLAlchemy 0.8.2开始,您可以在调用BEGIN时禁用隐式create_engine()语句

engine = create_engine(uri, isolation_level="AUTOCOMMIT")

这种变化有一些微妙的含义。首先,那些没有悄悄隐藏在未终止交易中的陈述将被悄然忽略

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

默认

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

其次,更新多个更新不再是自动更新,rollback()只是条件有效:

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

在Engine对象上设置SQLAlchemy的isolation_level对此有效 很多应用。遗憾的是Session.begin()并不总是意味着BEGIN TRANSACTION;

答案 1 :(得分:0)

默认情况下,SQLA始终在事务中运行(某些信息here)。在Web上下文中,大多数框架将在请求结束时处理为您提交此事务(例如pyramid_tm)。如果您没有使用框架,或者这是另一种类型的应用程序,那么您将需要在完成时或在适当的时候提交或回滚。

有可能配置SQLA使其不会自动启动事务,但据我所知,它不是如何使用它所以你可能有更好的运气而不是试图对抗它: )。