Я пытаюсь написать шахматно-ориентированную функциональность для бота-диссонанса.Одним из них является возможность играть в заочные игры.Я использую базу данных 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 () возвращает такой тип кортежа?
Если нет, что я сделал не так и что я могу сделать, чтобы исправить это?
Спасибо за чтение и извините за мой сомнительный английский.