我有一个与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 时,我在读取 PostgreSQL 中的配置文件时,所有选择 (select) 均会显示 idle in transaction
。
编辑:
通过回显查询结果,我发现每个选择 (select) 都以相同的方式开始:
BEGIN (implicit)
另一个编辑:
添加后
pool_size=20, max_overflow=0
对于create_engine
来说,当空闲连接数达到一定数量时,idle in transaction
语句似乎被回滚了。你有什么想法吗?这样做是否是解决问题的不好方法?
我应该如何管理这个问题,并且如何去掉SELECT
语句中的BEGIN
?
pool_timeout=90
吗?我在这里的文档中找到了它。 - user1593705commit
或rollback
来结束事务。begin
部分是隐含的(正如您所指出的),但需要正确地结束。另外:为什么您有一个空的过滤语句?这有意义吗?您处于 Web 上下文还是其他上下文中?最后,虽然极不推荐,但您可以使用autocommit
模式(但真的不要这样做)。 - javexcurrent_user.roles.filter().all()
时,我不明白您试图实现什么。为什么不只是执行current_user.roles
?这将返回一个列表,并自动在current_user
所属的会话上下文中执行(例如,如果您像这样查询:session.query(User).filter(User.id == some_id).one()
,则所有这些都将自动处理)。 - javexlazy='dynamic'
,这意味着它尚未查询,但需要进行查询。 - Asken