【发布时间】:2013-08-28 14:22:18
【问题描述】:
我有一个与 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-statements 似乎正在回滚。对此有任何想法吗?这会是解决问题的坏方法吗?
我该如何管理以及如何摆脱 BEGIN 的选择?
【问题讨论】:
-
你试过
pool_timeout=90吗?我找到了here in the doc -
我认为这并不能真正解决问题。我想摆脱选择时开始或选择时自动提交。
-
您没有正确结束交易。您必须
commit或rollback您的交易。begin部分是隐含的(如您所述),但需要正确结束。另外:为什么你有一个空的过滤器语句?那有意义吗?您是在网络环境中还是在不同的环境中?最后,虽然非常不推荐,但您可以使用autocommit模式(但实际上,不要)。 -
@javex,谢谢。我一直在阅读并从交易中获得了大部分,但我的
relationsships中仍有一些我无法真正触及。 sqlalchemy 会自动关闭这些吗?。 -
通常您应该在单个会话上操作。尽管如此,我还是不明白你在做
current_user.roles.filter().all()时想要达到的目标。为什么不直接做current_user.roles?这给出了一个列表并在current_user所属的会话的上下文中自动执行(例如,如果您这样查询:session.query(User).filter(User.id == some_id).one()那么这一切都将被自动处理。
标签: python session transactions sqlalchemy