我有一个与 sqlalchemy 和 postgresql 相关的问题。
class Profile(Base):
...
roles = relationship('Role', secondary=role_profiles,
backref='profiles', lazy='dynamic')
运行时(current_user
是Profile
类的一个实例):
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
?
最佳答案
从 SQLAlchemy 0.8.2 开始,您可以在调用 create_engine()
时禁用隐式 BEGIN
语句
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;
关于python - sqlalchemy、postgresql 和关系卡在 "idle in transaction",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18438300/