psycopg2: cur.fetchone () возвращает результат предыдущего запроса - PullRequest
0 голосов
/ 07 января 2020

У меня странное поведение, когда у меня несколько запросов к одному и тому же курсору:
предыдущий запрос - 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 в зависимости от моего запроса).
Но впервые за многие годы у меня возникают такие коллизии, понимаете?

отредактировано:
создание нового курсора (DictCursor) и того же cnx- перед .execute () и закрытие его после .fetchone () для каждого запроса не сильно меняется, но время от времени результат последнего запроса (строка из шаблона, а не из сообщения)

1 Ответ

0 голосов
/ 07 января 2020

Я обновил с psycopg2 2.7.1 до 2.8.4
Затем решил Ошибка SSL , добавив lazy-apps = True в конфигурации uwsgi.
Пока курсоры больше не сталкиваются

Короче говоря, uwsgi разветвлялся, разделяя тот же pg cnx, в то время как соединение psycopg2 не является поточно-ориентированным на этом уровне. Кажется, что psycopg2 теперь генерирует исключение (ошибка SSL), связанное с этим.

...