Вопрос: Как передать несколько предикатов в SQL в Python

#python #sql #parameters

#python #sql #параметры

Вопрос:

Я использую ibm_db_dbi для подключения к базе данных DB2, и мне нужно передать несколько предикатов в SQL. У меня есть приведенный ниже пример кода, который работает, но у меня возникают трудности с передачей нескольких предикатов в SQL. Цель состоит в том, чтобы передать запрос в DB2, а затем записать данные обратно либо в список, либо в dataframe на Python

Вот запрос, который я хочу передать в базу данных:

 select someStuff
from tableA a join tableB b on a.key = b.key
where a.value = %s and a.date between %s and %s
  

У меня есть фрейм данных, содержащий три столбца (атрибут value, date1 и date 2) и набор значений в каждом из столбцов. Мой план состоял в том, чтобы передать данные с помощью цикла for и выполнить запрос столько раз, сколько у меня есть строк в dataframe, а затем добавить каждый результат обратно в объект list.

Я пытаюсь достичь своей цели на основе скромного, простого примера запроса. До сих пор мне удавалось запускать запрос, содержащий один parm, но мне было трудно сделать его расширяемым до трех. Проблема в том, что я не знаю, как ссылаться на три отдельных «столбца» в приведенной ниже ссылке на объект запроса. Приветствуется любая помощь

Ниже приведен мой тестовый запрос, который работает до сих пор:

 blahList = [-123,123]
dataDB2 = []

for item in blahList:
  aTestSQL = """
  select '%s' value from sysibm.sysdummy1
  """
  query = aTestSQL % (item)
  curDB2 = conDB2.cursor()
  curDB2.execute(query)
  dataDB2.append(curDB2.fetchone())
  

Комментарии:

1. взгляните на исходный код : вы не должны форматировать запрос в строку, а вместо этого использовать замену параметров, которую позволяет Cursor объект

2. Я понимаю, что вы имеете в виду, что объект Cursor допускает замену параметров, и думаю, что это лучший подход, чем то, что я придумал. К сожалению, я не смог заставить подстановку параметров работать с курсором. Если бы вы были готовы взглянуть на решение, которое я опубликовал, и показать мне пример замены параметра курсора, который выполняет то же самое, я был бы вам очень признателен.

3. можете ли вы поделиться фрагментом кода о том, как вы пытались заменить параметр?

Ответ №1:

Вот решение, которое я придумал, возможно, оно поможет следующему человеку:

 blahlist = [(-1990963710,'ralph'), (3912019,'wreckit')]
dataDB2 = []

for idx, val in enumerate(blahlist):
  number = val[0]
  name = val[1]

  aTestSQL = """
  select %d NUMBER, '%s' NAME from sysibm.sysdummy1
  """
  query = aTestSQL % (number,name)
  curDB2 = conDB2.cursor()
  curDB2.execute(query)
  dataDB2.append(curDB2.fetchall())