PostgreSQL INSERT基于使用Python的SELECT结果

时间:2015-09-24 00:24:47

标签: python database postgresql

过去一周我一直在努力解决这个问题,并且无法解决这个问题。我有一个PostgreSQL数据库,可以跟踪玩家在锦标赛中玩比赛的情况。我正在研究一个报告匹配结果的函数。报告匹配结果的方式是简单地更新数据库(我现在不担心实际的报告系统)。

以下是执行报告的功能:

EPStatementObjectModel

我在上面注释掉的那一行是我收到错误的地方。更准确地说明一点:def reportMatch(winner, loser): """Records the outcome of a single match between two players. Args: winner: the id number of the player who won loser: the id number of the player who lost """ connection = connect() cursor = connection.cursor() match_played = 1 insert_statement = "INSERT INTO matches (winner_id, loser_id) VALUES (%s, %s)" cursor.execute(insert_statement, (winner, loser)) cursor.execute("INSERT INTO players (match_count) VALUES (%s) SELECT players.id FROM players where (id = winner)" (match_played,)) # here is where I have my issue at runtime connection.commit() cursor.execute("INSERT INTO players(match_count) SELECT (id) FROM players VALUES (%s, %s)",(match_played, loser,)) connection.commit() connection.close

给出的错误如下:

  

文件“/vagrant/tournament/tournament.py”,第103行,在reportMatch中       cursor.execute(insert_statement_two,(match_played,winner))   psycopg2.ProgrammingError:“SELECT”处或附近的语法错误   第1行:INSERT INTO玩家(match_count)VALUES(1)SELECT(id)FROM ...

如果有帮助,这是我的架构:

cursor.execute("INSERT INTO players(match_count) VALUES (%s) SELECT (id) FROM players WHERE (id = %s)",(match_played, winner,))

我对MySQL数据库有一些经验,但对PostgreSQL来说还是比较新的。我花了很多时间在线阅读指南和教程,但没有运气好。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

您无法在VALUES语句中指定SELECT和使用INSERT。它是一个或另一个。

有关详细信息,请参阅 Postgres 文档中INSERT的定义。

您也无需指定id值,因为serial是一个特殊序列。

该行在INSERT字符串之后也缺少逗号。

为了指定特定值,您可以使用SELECT缩小WHERE,和/或利用之前RETURNING中的INSERT缩小范围,但具体细节这取决于你想要如何将它们链接在一起。 (我不完全确定你在上面的代码中将表格链接在一起的具体内容。)

我怀疑使用RETURNINGplayers获取INSERTINSERT的ID,然后将matches转换为// In chrome you can now do this navigator.permissions.query({name: 'geolocation'}).then(function(PermissionStatus){ console.log(PermissionStatus.state) // prompt, granted, denied // even listen for changes PermissionStatus.onchange = function(){ console.log(this.state) } }) 。你想要做的事情。