синтаксическая ошибка psycopg2 из-за одинарных кавычек в команде вставки - PullRequest
1 голос
/ 06 апреля 2019

Я пытаюсь выполнить команду "вставить таблицу" с помощью psycopg2.Я создаю командную строку в функции, которая возвращает строку следующей формы:

create table %s (  %s %s , %s %s , %s %s , %s %s , %s %s , %s %s , %s %s , %s %s , %s %s , %s %s , %s %s , primary key %s );

Функция также возвращает набор строковых переменных, которые я хочу использовать для заполнения строк формата:

('games', 'score_loser', 'integer', 'playoffs', 'boolean', 'record_loser', 'integer[]', 'broadcast', 'varchar(20)', 'date', 'date', 'id', 'varchar (30)', 'home_team', 'varchar (50)', 'record_winner', 'integer[]', 'winner', 'varchar (50)', 'loser', 'varchar (50)', 'score_winner', 'integer', 'id')

Но когда я пытаюсь выполнить команду, у меня возникает проблема, заключающаяся в том, что переменные из кортежа помещаются в одинарные кавычки, что приводит к синтаксической ошибке в psycopg2:

psycopg2.ProgrammingError: syntax error at or near "'games'"

LINE1: создать таблицу 'games' ('score_loser' 'integer', 'playoffs' ...

Может кто-нибудь сказать мне, что нужно сделать вместо этого?

1 Ответ

3 голосов
/ 06 апреля 2019

Вы не можете этого сделать. Из документации Psycopg по параметрам запроса :

Этот метод должен связывать только значения запроса: его нельзя использовать для объединения имен таблиц или полей в запрос (Psycopg попытается процитировать имя таблицы как строковое значение, генерируя недопустимый SQL). Если вам нужно генерировать динамические запросы SQL (например, динамически выбирая имя таблицы), вы можете использовать средства, предоставляемые модулем psycopg2.sql:

>>> cur.execute("INSERT INTO %s VALUES (%s)", ('numbers', 10))  # WRONG
>>> cur.execute(                                                # correct
...     SQL("INSERT INTO {} VALUES (%s)").format(Identifier('numbers')),
...     (10,))
...