psycopg2:cur.fetchone()返回上一个请求结果

问题描述 投票:0回答:1

在同一个游标上有多个查询时,我有这种奇怪的行为:先前的请求是SELECT * FROM template WHERE id = 10,结果是1行,使用.fetchone()获取然后:

print(cnx.cur.query)
# output OK: b"SELECT * FROM template WHERE id=10"
print(cnx.cur.statusmessage)
# output OK: SELECT 1
cnx.cur.execute("SELECT * FROM msg WHERE id=%s ORDER BY ts DESC LIMIT 1", [345])
print(cnx.cur.query)
# output OK: b"SELECT * FROM msg WHERE id=345 ORDER BY ts DESC LIMIT 1"
print(cnx.cur.statusmessage, cnx.cur.rowcount)
# output OK: 1 1
row = cnx.cur.fetchone()
print(row)
# output KO: prints result from previous query, ie table template

psycopg2 pg连接始终使用相同的游标(一个RealDictCursor,一个DictCursor,取决于我的查询)保持打开状态数周。但是我有这么多年的碰撞是第一次,有见识吗?

编辑:对于每个请求,在.execute()之前创建一个新游标(DictCursor)并使用相同的cnx,然后在.fetchone()之后关闭该游标不会有太大变化,但仍然不时有最后一个请求结果(从模板而不是从msg行)

postgresql psycopg2 uwsgi
1个回答
0
投票

我从psycopg2 2.7.1升级到2.8.4然后通过在uwsgi配置中添加lazy-apps = True解决此SSL error问题。到目前为止,游标不再发生冲突

简而言之,uwsgi是分叉的,共享相同的pg cnx,而psycopg2连接在此级别上不是线程安全的。似乎psycopg2现在会引发与此相关的异常(SSL错误)。

© www.soinside.com 2019 - 2024. All rights reserved.