Метод psycopg2 fetchone (), возвращающий одноэлементный кортеж, содержащий строку, представляющую кортеж «result» - PullRequest
0 голосов
/ 19 мая 2019

Я пытаюсь написать шахматно-ориентированную функциональность для бота-диссонанса.Одним из них является возможность играть в заочные игры.Я использую базу данных postgresql для хранения каждой игры.

Проблема, с которой я столкнулся, заключается в том, что когда я вызываю cursor.fetchone() после выполнения запроса SELECT sql, возвращаемый объект представляет собой одноэлементный кортеж, содержащий строкуэто представляет искомый кортеж.

Например: ('(351817698172207105,"",1)',) вместо (351817698172207105,"",1)

Я установил psycopg2 с pip3 (и использовал его с python 3.6.7).

Я решил эту проблемус помощью ast.literal_eval в первом запросе SELECT (создание и принятие вызова)

Но другой запрос содержит PGN игры, который содержит много кавычек, что приводит к сбою функции literal_eval.Я мог бы возиться с возвращенной строкой, но я не уверен, что это лучший вариант (и я хотел бы понять, почему это так).

Первый «обход»:


from ast import literal_eval as make_tuple

cdesc = psycopg2.connect(**params_db)
curs = cdesc.cursor()
modele_req = "SELECT (id_j1, id_j2, id_challenge) FROM challenges WHERE (id_j2='{0}' OR id_j2 = '') AND id_challenge = {1};"

# id_acceptant and id_partie_acceptee are given
req = modele_req.format(id_acceptant, str(id_partie_acceptee))

res_tuple = curs.fetchone()
# print(res_tuple) produces the following output :
# ('(351817698172207105,"",1)',)
(idj1, idj2, idpartie) = make_tuple(res_tuple[0])

Кроме того, ниже приведен пример возвращенного кортежа во «втором» запросе:

(  '("[Event ""?""]\n[Site ""?""]\n[Date ""????.??.??""]\n[Round ""?""]\n[White ""?""]\n[Black ""?""]\n[Result ""*""]\n\n*",351817698172207105,351817698172207105,t)'  ,)

При использовании функции make_tuple / literal_eval у меня (очевидно) возникает следующая ошибка:

(...)
File "/home/synophride/projets/discord_bot/bot/commandes_echecs.py", line 568, in move_bd
    (game_pgn, id_blanc, id_noir, joueur_jouant) = make_tuple(str_tuple)
  File "/usr/lib/python3.6/ast.py", line 85, in literal_eval
    return _convert(node_or_string)
  File "/usr/lib/python3.6/ast.py", line 59, in _convert
    return tuple(map(_convert, node.elts))
  File "/usr/lib/python3.6/ast.py", line 84, in _convert
    raise ValueError('malformed node or string: ' + repr(node))
ValueError: malformed node or string: <_ast.Name object at 0x7fe1956f5978>

Короче говоря:

  • Это нормально, что метод cursor.fetchone () возвращает такой тип кортежа?

  • Если нет, что я сделал не так и что я могу сделать, чтобы исправить это?

Спасибо за чтение и извините за мой сомнительный английский.

1 Ответ

0 голосов
/ 20 мая 2019

Когда вы используете скобки в своем запросе, postgres не возвращает столбцы (они объединены в одну запись).

Ваш запрос должен выглядеть следующим образом, чтобы получить все столбцы:

modele_req = "SELECT id_j1, id_j2, id_challenge FROM challenges WHERE ..."

Тогда psycopg2 вернет кортеж из 3 предметов, который не представлен в виде строки:

((351817698172207105,"",1),)
...