#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())