过去一周我一直在努力解决这个问题,并且无法解决这个问题。我有一个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来说还是比较新的。我花了很多时间在线阅读指南和教程,但没有运气好。任何帮助将不胜感激!
答案 0 :(得分:1)
您无法在VALUES
语句中指定SELECT
和使用INSERT
。它是一个或另一个。
有关详细信息,请参阅 Postgres 文档中INSERT
的定义。
您也无需指定id
值,因为serial
是一个特殊序列。
该行在INSERT
字符串之后也缺少逗号。
为了指定特定值,您可以使用SELECT
缩小WHERE
,和/或利用之前RETURNING
中的INSERT
缩小范围,但具体细节这取决于你想要如何将它们链接在一起。 (我不完全确定你在上面的代码中将表格链接在一起的具体内容。)
我怀疑使用RETURNING
从players
获取INSERT
个INSERT
的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)
}
})
。你想要做的事情。