Как передать список параметров в Pandas read_sql с помощью Teradata

#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:

У вас есть пара проблем:

  1. В вашем примере имя пакета написано teradatasql с ошибкой tearadatasql.connect
  2. Вы должны составить 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. Параметр представляет собой список, но параметры могут быть словарем