#python #pandas #postgresql
#python #pandas #postgresql
Вопрос:
Извините, ребята, я потерял в кавычках!
У меня есть процедура
# A function that takes in a PostgreSQL query and outputs a pandas database
def create_pandas_table(sql_query, database = conn):
table = pd.read_sql_query(sql_query, database)
return table
и я пытаюсь передать оператор sql (PostgreSQL), что отлично работает в SQL terminal:
SELECT * FROM public.payments WHERE payments."createdAt" > '2021-01-01'
Единственный способ, которым я смог передать правильную строку, это:
date_string = "'2021-01-01'"
table_payments = create_pandas_table(r'SELECT * FROM public.payments WHERE payments."createdAt" > ' date_string)
Я пробовал тройные кавычки, обратную косую черту … мне ничего не помогло.
r'SELECT * FROM public.payments WHERE payments."createdAt" > '''2021-01-01'''''
как я могу передать строку в одном операторе?
Ответ №1:
date_string = "'2021-01-01'"
table_payments = create_pandas_table(r'SELECT * FROM public.payments WHERE payments."createdAt" > {}'.format(date_string))
Попробуйте это. Мне не удалось воспроизвести вашу проблему, но это альтернативный способ выполнения конкатенации.
Комментарии:
1. Спасибо! да, это тоже работает. идея не использовать какие-либо дополнительные переменные, такие как date_string, и писать весь оператор в одной строке.
Ответ №2:
pandas.read_sql_query() также принимает параметры, чтобы избежать SQL-инъекции:
список параметров, кортеж или dict, необязательно, по умолчанию: Нет Список параметров для передачи в метод execute . Синтаксис, используемый для передачи параметров, зависит от драйвера базы данных. Проверьте документацию вашего драйвера базы данных, какой из пяти синтаксических стилей, описанных в paramstyle PEP 249, поддерживается. Например. для psycopg2 использует %(name)s, поэтому используйте params={‘name’ : ‘value’} .
Комментарии:
1. Спасибо. Я не собираюсь передавать параметры в строку. вопрос в том, как правильно установить строку, содержащую кавычки.
2. Вы этого не делаете? Но ваш код на самом деле делает это, и проблемы, с которыми вы сталкиваетесь с кавычками, могут быть исправлены с помощью paramslist .
3. параметры — это обходной путь. Я думаю, я просто не знаю, как использовать «‘ или «‘ или chr() … чтобы установить правильную строку в качестве параметра одной строки. Если pandas это не поддерживает — все в порядке, я останусь с обходным путем params.
Ответ №3:
ОТ https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_sql_query.html :
список параметров, кортеж или dict, необязательно, по умолчанию: Нет Список параметров для передачи в метод execute . Синтаксис, используемый для передачи параметров, зависит от драйвера базы данных. Проверьте документацию вашего драйвера базы данных, какой из пяти синтаксических стилей, описанных в paramstyle PEP 249, поддерживается. Например. для psycopg2 использует %(name)s, поэтому используйте params={‘name’ : ‘value’} .
попробуйте передать параметры таким образом