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

Ask*_*ken 11 python session transactions sqlalchemy

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

class Profile(Base):
  ...

  roles = relationship('Role', secondary=role_profiles,
                       backref='profiles', lazy='dynamic')
Run Code Online (Sandbox Code Playgroud)

运行时(current_userProfile类的实例):

roles = current_user.roles.filter().all()
Run Code Online (Sandbox Code Playgroud)

使用sqlalchemy我得到idle in transaction了所有选择,以便在postgresql中读取配置文件.

编辑:

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

BEGIN (implicit)
Run Code Online (Sandbox Code Playgroud)

另一个编辑:

添加后

pool_size=20, max_overflow=0
Run Code Online (Sandbox Code Playgroud)

create_engine它好像idle in transaction-statements被回滚时空闲的数量越来越变大.有任何想法,这将是一个解决问题的坏方法吗?

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

era*_*man 5

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

engine = create_engine(uri, isolation_level="AUTOCOMMIT")
Run Code Online (Sandbox Code Playgroud)

此更改有一些微妙的含义。首先,没有被悄悄地隐藏在未终止事务中的语句将被悄悄地忽略

session.execute("DELETE FROM department WHERE department_id=18")
sys.exit(0)
Run Code Online (Sandbox Code Playgroud)

默认值

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
Run Code Online (Sandbox Code Playgroud)

自动提交

LOG:  statement: show standard_conforming_strings
LOG:  statement: DELETE FROM department WHERE department_id=18
Run Code Online (Sandbox Code Playgroud)

其次,更新多个更新不再rollback()是自动的,仅在有条件的情况下有效:

department = Department(u"HR")
session.add(department)
session.flush()
employee = Employee(department.department_id, u'Bob')
session.add(employee)
session.rollback()
Run Code Online (Sandbox Code Playgroud)

默认值

LOG:  statement: BEGIN
LOG:  statement: INSERT INTO department (name) VALUES ('HR') RETURNING department.department_id
LOG:  statement: ROLLBACK
Run Code Online (Sandbox Code Playgroud)

自动提交

LOG:  statement: INSERT INTO department (name) VALUES ('HR') RETURNING department.department_id
Run Code Online (Sandbox Code Playgroud)

isolation_level在Engine对象上设置SQLAlchemy 对许多应用程序有效。不幸的是,Session.begin()这并不总是意味着BEGIN TRANSACTION;


Dan*_*iel 3

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

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