#python #pandas
#python #pandas
Вопрос:
Есть ли способ или как я могу исправить свой синтаксис, чтобы передать список параметров строки в SQL-запрос в pandas? У меня есть следующий код, но он не работает, поэтому у меня есть список строк, и мне нужно динамически передавать этот параметр списка в запрос
import teradatasql
import pandas as pd
connection = tearadatasql.connect(host="xxx",user="xxx",password="xxx")
column_list = ['A','B','C']
query = """
select column, row
from table1
where column in (%s)
"""
df = pd.read_sql(query, connection, params=column_list)
Ответ №1:
У вас есть пара проблем:
- В вашем примере имя пакета написано
teradatasql
с ошибкойtearadatasql.connect
- Вы должны составить IN-предикат с тем же количеством вопросительных меток параметров, что и количество значений, которые вы собираетесь связать.
В вашем примере вы намерены связать три значения, содержащиеся в column_list
переменной, поэтому вы должны составить IN-предикат с тремя вопросительными знаками. маркеры параметров.
Вообще говоря, вы должны динамически составлять IN-предикат с количеством вопросительных маркеров параметров, равным количеству значений в списке значений параметров, которые вы будете привязывать.
Ниже приведена модифицированная версия вашего примера, которая исправляет эти две проблемы. Я действительно запустил этот пример и убедился, что он работает.
import teradatasql
import pandas as pd
with teradatasql.connect(host="whomooz",user="guest",password="please") as connection:
with connection.cursor() as cur:
cur.execute("create volatile table table1 (c1 varchar(1), c2 integer) on commit preserve rows")
cur.execute("insert into table1 values ('A', 1) ; insert into table1 values ('B', 2)")
column_list = ['A','B','C']
query = "select c1, c2 from table1 where c1 in ({}) order by c1".format(','.join(['?'] * len(column_list)))
print(query)
print("with params={}".format (column_list))
df = pd.read_sql(query, connection, params=column_list)
print(df)
В этом примере выводится следующий результат:
select c1, c2 from table1 where c1 in (?,?,?) order by c1
with params=['A', 'B', 'C']
c1 c2
0 A 1
1 B 2
Комментарии:
1. Спасибо. это работает, и я также нашел другой способ заставить его работать.
Ответ №2:
Вы должны заполнить %s некоторыми параметрами
df = psql.read_sql(('select "column","row" from "table1" '
'where "column" in %(col_list)s'), connection, params={'col_list':column_list})
Комментарии:
1. Я пытался сделать так, как вы предлагаете, и это не работает. Я не знаю, как и где я могу заполнить свои параметры правильным синтаксисом?
2. Я получил новый код ошибки для нового ответа: ‘: параметры неожиданного типа <class ‘dict’>
3. Согласно документации, параметры могут быть dict, можете ли вы проверить это, возможно, вы скопировали не полностью или что-то пропустили
4. но у меня есть список, а не dict, который я хочу передать в SQL
5. Параметр представляет собой список, но параметры могут быть словарем