2015-09-24 3 views
0

Я пытаюсь объединиться с этой проблемой на прошлой неделе и не смог ее обойти. У меня есть база данных 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. Я много времени проводил с гидами и учебниками онлайн, но не имел удачи. Любая помощь будет оценена!

ответ

1

Вы не можете указать VALUES и использовать SELECT в заявлении INSERT. Это одно или другое.

См. Определение INSERT в Postgres doc для получения более подробной информации.

Вы также не должны указывать значение id, так как serial - специальная последовательность.

Эта строка также не имеет запятой после строки INSERT.

Для того, чтобы задать конкретные значения, вы можете сузить SELECT с WHERE и/или рычаги RETURNING от ранее INSERT с, но специфика, которая будет зависеть от того, как именно вы хотите, чтобы связать их вместе. (Я не совсем уверен, что именно то, что вы собираетесь с точки зрения увязки таблицы вместе с кодом выше.)

Я подозреваю, используя RETURNING, чтобы получить 2 идентификаторы из players, которые были INSERT ред и с использованием тех, в свою очередь, в INSERT в matches соответствует строкам того, что вы хотите сделать.

+0

Pedantic nitpick: На самом деле, вы можете, в этом 'VALUES' можно использовать в подзапросе. 'INSERT INTO sometable (somecol) SELECT n FROM (VALUES (1), (2), (3)) x (n)'. Я даже нашел время, когда это желательно сделать. –

+0

А, TIL. Хорошо знать. – khampson

Смежные вопросы