Psycopg2 ProgrammingError: синтаксическая ошибка в или около SELECT - PullRequest
0 голосов
/ 10 мая 2019

Попытка передать переменную в запрос psql. Код ниже. В конечном итоге я пытаюсь скопировать результаты в файл CSV, и возникает ошибка при попытке выполнить модуль cur.copy_expert.

date1 = ('2019-05-06',)
query = ('''SELECT * FROM product WHERE (product.esb_timestamp > %s AND product.esb_timestamp < '2019-05-11')''', date1)

# Copy the results to a new file
output = "COPY ({0}) to STDOUT WITH CSV HEADER".format(query)
with open('Database_Query.csv', 'w') as file1:
    cur.copy_expert(output, file1)

Ошибка ниже:

Traceback (most recent call last):
  File "database_query.py", line 55, in <module>
    cur.copy_expert(output, file1)
psycopg2.ProgrammingError: syntax error at or near ""SELECT * FROM nwwproduct WHERE (nwwproduct.esb_timestamp > %s AND nwwproduct.esb_timestamp < '2019-05-11')""
LINE 1: COPY (("SELECT * FROM nwwproduct WHERE (nwwproduct.esb_times...

Ответы [ 2 ]

2 голосов
/ 10 мая 2019

Как psycopg2 документы упоминает

Если вам нужно динамически составить оператор COPY (потому что таблица, поля или параметры запроса находятся в переменных Python) вы можете использовать объекты, предоставляемые модулем psycopg2.sql.

Это также подтверждается этим билетом GitHub одним из авторов psycopg2 и текущим сопровождающим: @ dvarrazzo.

from psycopg2 import sql

stmt = """COPY (SELECT * FROM product 
                WHERE (product.esb_timestamp > {dt} 
                  AND  product.esb_timestamp < '2019-05-11')
               ) TO STDOUT WITH CSV HEADER"""

query = sql.SQL(stmt).format(dt=sql.Literal("2019-05-06"))

with open('Database_Query.csv', 'w') as file1:
    cur.copy_expert(query, file1)

Имейте в виду, что это отличается от str.format Python и безопасно интерполирует значения в подготовленный оператор.

0 голосов
/ 10 мая 2019

COPY не поддерживает параметры. Ссылка

...