psycopg2 fetchone()方法返回包含表示“结果”元组

时间:2019-05-19 13:13:26

标签: python psycopg2

我正在尝试为不和谐的机器人编写面向国际象棋的功能。 其中之一是能够玩对应游戏。 我正在使用一个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()方法返回这种元组是否正常?

  • 如果不是,我做错了什么,我该怎么做才能纠正?

感谢您的阅读,并为我最终的可疑英语感到抱歉。

1 个答案:

答案 0 :(得分:0)

在查询中使用方括号时,postgres不会返回列(它们被堆叠到一个记录中)。

您的查询应如下所示,以获取所有列:

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

然后psycopg2将返回3个项目的元组,该项目不以字符串表示:

((351817698172207105,"",1),)