我正在尝试为不和谐的机器人编写面向国际象棋的功能。 其中之一是能够玩对应游戏。 我正在使用一个postgresql数据库来存储每个游戏。
我遇到的问题是,当我执行SELECT sql请求后调用cursor.fetchone()
时,返回的对象是一个单元素元组,其中包含表示所需元组的字符串。
例如:
('(351817698172207105,"",1)',)
代替(351817698172207105,"",1)
我将psycopg2与pip3一起安装(并与python 3.6.7一起使用)。
在第一个SELECT请求中使用ast.literal_eval
解决了这个问题(创建并接受挑战)
但是另一个请求包含游戏的PGN,其中包含许多引号,这使literal_eval函数失败。 我可能会弄乱返回的str,但是我不确定这是最好的选择(而且我想了解为什么会这样)。
第一个“解决方法”:
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()方法返回这种元组是否正常?
如果不是,我做错了什么,我该怎么做才能纠正?
感谢您的阅读,并为我最终的可疑英语感到抱歉。
答案 0 :(得分:0)
在查询中使用方括号时,postgres不会返回列(它们被堆叠到一个记录中)。
您的查询应如下所示,以获取所有列:
modele_req = "SELECT id_j1, id_j2, id_challenge FROM challenges WHERE ..."
然后psycopg2将返回3个项目的元组,该项目不以字符串表示:
((351817698172207105,"",1),)