динамический формат строки из кортежей кортежа с использованием Python - PullRequest
0 голосов
/ 24 сентября 2018

В приведенном ниже сценарии 1 отлично работает в обоих случаях (код 1 и код 2).Но сценарий 2 не работает в коде 1.

Мое требование состоит в том, чтобы Tuple продолжал повторяться до тех пор, пока он не заполнит все строки форматирования в запросе динамически.Потому что условия where не постоянны для всех запросов.

Сценарий 1 #

query = SELECT * FROM test.order where total_price in {}

Tuple:

finTup=((125, 125, 125, 125),)
SELECT * FROM test.order where total_price in (125, 125, 125, 125)

Сценарий2 #

query = SELECT * FROM test.order WHERE order_id IN {} AND product_id IN {}

Кортеж:

finTup=((101, 105, 106, 107), (2, 2, 2, 2))

Код 1:

frt = 'finTup[{}]'
half = ''
val = ''
i = 0
le = len(finTup)
for i in range(le):
    print(i)
    print(eval(frt.format(i)))
    if i == le -1:
        half = half + frt.format(i)
        val = val + " " + frt.format(i)
    else:
        half = half + frt.format(i)+', '
        val = val + " " + frt.format(i)+', '
temp2 = query.format(eval(val))

Код 2:

if le == 1:
     query = query.format(finTup[0])
elif le == 2:
      query = query.format(finTup[0], finTup[1])
 elif le == 3:
       query = query.format(finTup[0], finTup[1], finTup[2])
elif le == 4:
       query = query.format(finTup[0], finTup[1], finTup[2], finTup[3])

Error:
temp2 = query.format(eval(val))
IndexError: tuple index out of range

Пожалуйста, помогите мне исправить это.

1 Ответ

0 голосов
/ 24 сентября 2018

TL; DR

Здравствуйте, у вас есть эта ошибка, потому что вы пытаетесь предоставить один аргумент для функции format, которая ожидает два параметра (так как у вас есть 2 {}).

Примечание : избегайте использования функции eval ... Это довольно не рекомендуется, тем более в текущей ситуации, в которой вы находитесь.Все может быть сделано без необходимости оценивать str.


. Далее я запускаю код только для Сценарий # 2 , т.е.

query2 = """SELECT * FROM test.order WHERE order_id IN {} AND product_id IN {}"""
finTup = ((101, 105, 106, 107), (2, 2, 2, 2))

Шаг 1: Отладка

Представим, что вы обновляете свой код для отладки следующим образом:

frt = 'finTup[{}]'
half = ''
val = ''
i = 0 # btw, you don't need to initialize i here
le = len(finTup)

for i in range(le):
    if i == le -1:
        half = half + frt.format(i)
        val = val + " " + frt.format(i)
    else:
        half = half + frt.format(i)+', '
        val = val + " " + frt.format(i)+', '

print val
print eval(val)

temp2 = query.format(eval(val))

Выходные данные должны быть:

 vars[0],  vars[1]
((101, 105, 106, 107), (2, 2, 2, 2))

Итакпредставьте, что вы пишете код Python из вышеприведенного вывода, что бы вы сделали:

query.format(((101, 105, 106, 107), (2, 2, 2, 2)))

Вы фактически предоставляете один параметр типа tuple с двумя элементами.Но важно то, что вы предоставляете format с единственным параметром .Функция format попытается получить доступ ко второму параметру, который вы не предоставляете.Он ломается.


Шаг 2: Исправление кода

Посмотрите на эту ТА статью .Он показывает вам, как использовать оператор *.Это в основном превращает list или tuple в последовательность предметов.Идеально подходит для параметров функций и т. Д.

Итак, применимо к вашему текущему случаю:

temp2 = query.format(*eval(val))

И трюк готов.


Шаг 3: Оптимизация

Теперь давайте отбросим Код 1 и используем то, что мы изучили с Код 2 .Нам нужно распаковать tuple из tuple в параметры для подачи в format.Итак, почему бы просто сделать:

# I renamed `finTup` to `vars` since I don't know what it means
def get_query(query, vars):
    return query.format(*vars)

Он в основном объединяет логику Code 1 и Code 2 в одну строку.

...