Я пытаюсь объединиться с этой проблемой на прошлой неделе и не смог ее обойти. У меня есть база данных PostgreSQL, которая отслеживает игроков, играющих матчи в турнире. Я работаю над функцией, которая сообщает результаты матчей. То, как он сообщает результаты матчей, - это просто обновление базы данных (на данный момент я не беспокоюсь о реальной системе отчетности).PostgreSQL INSERT на основе результатов SELECT с использованием Python
Вот функция, которая делает отчетность:
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
линии который я заметил выше, где я получаю сообщение об ошибке. Чтобы быть более точным, и определить его: cursor.execute("INSERT INTO players(match_count) VALUES (%s) SELECT (id) FROM players WHERE (id = %s)",(match_played, winner,))
выдаваемая ошибка заключается в следующем:
File "/vagrant/tournament/tournament.py", line 103, in reportMatch cursor.execute(insert_statement_two, (match_played, winner)) psycopg2.ProgrammingError: syntax error at or near "SELECT" LINE 1: INSERT INTO players(match_count) VALUES (1) SELECT (id) FROM...
Если это помогает, вот моя схема:
CREATE TABLE players (
id serial PRIMARY KEY,
name varchar(50),
match_count int DEFAULT 0,
wins int DEFAULT 0,
losses int DEFAULT 0,
bye_count int
);
CREATE TABLE matches (
winner_id serial references players(id),
loser_id serial references players(id),
did_battle BOOLEAN DEFAULT FALSE,
match_id serial PRIMARY KEY
);
У меня есть некоторый опыт работы с MySQL базы данных, но довольно новичок в PostgreSQL. Я много времени проводил с гидами и учебниками онлайн, но не имел удачи. Любая помощь будет оценена!
Pedantic nitpick: На самом деле, вы можете, в этом 'VALUES' можно использовать в подзапросе. 'INSERT INTO sometable (somecol) SELECT n FROM (VALUES (1), (2), (3)) x (n)'. Я даже нашел время, когда это желательно сделать. –
А, TIL. Хорошо знать. – khampson