psycopg2: cur.fetchone() 返回之前的请求结果
psycopg2: cur.fetchone() returning previous request result
在同一个游标上进行多个查询时,我有这种奇怪的行为:
先前的请求是 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 )
我从 psycopg2 2.7.1 升级到 2.8.4
然后通过在 uwsgi 配置中添加 lazy-apps = True 来解决这个 SSL error。
到目前为止,光标不再发生碰撞
简而言之,uwsgi 正在分叉,共享相同的 pg cnx,而 psycopg2 连接在此级别不是线程安全的。似乎 psycopg2 现在抛出与此相关的异常(SSL 错误)。
在同一个游标上进行多个查询时,我有这种奇怪的行为:
先前的请求是 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 )
我从 psycopg2 2.7.1 升级到 2.8.4
然后通过在 uwsgi 配置中添加 lazy-apps = True 来解决这个 SSL error。
到目前为止,光标不再发生碰撞
简而言之,uwsgi 正在分叉,共享相同的 pg cnx,而 psycopg2 连接在此级别不是线程安全的。似乎 psycopg2 现在抛出与此相关的异常(SSL 错误)。