правильное использование кавычек в операторах sql

#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’} .

попробуйте передать параметры таким образом