Передать список строк в сырой SQL-запрос (Python / Django) - PullRequest
1 голос
/ 20 сентября 2019

Мне нужно передать динамический список строк в сырой SQL-запрос.Вот мой код:

myList = ['PREFIX\000\000923', 'PREFIX\000\000CS3'] # <- strings I have troubles with
myList = ['OK1', 'OK2'] # <- ok strings
myTuple = tuple(myList)
query = "SELECT * FROM public.items WHERE name IN {}".format(myTuple)
result = cursor.execute(query, myTuple)
rows =  dict_fetch_all(cursor)
for row in rows:
    print(row)

Приведенный выше фрагмент кода работает просто отлично.Однако существует проблема со строками со специальными символами с обратной косой чертой, например: "PREFIX\000\000923". Как правильно ее кодировать?

[EDIT] Вот печатный запрос в консоли:

SELECT * FROM public.items WHERE name IN ('PREFIX\x00\x00923', 'PREFIX\x00\x00CS3')

Как видите, элементы myList были преобразованы в какую-то странную строку.

1 Ответ

0 голосов
/ 20 сентября 2019

Обратная косая черта - это специальный символ в Python.

Если поставить одну обратную косую черту, а затем любой другой символ, то это означает, что какой-то другой символ в финальной строке будет таким, как это происходит в вашем случае.

enter image description here

Чтобы убедиться, что ваша последняя строка содержит обратную косую черту, а не какой-либо странный символ, необходимо поместить два последовательных символа обратной косой черты следующим образом.

enter image description here

Это будет именно то, что вы хотите.Вы можете прочитать больше об этом здесь .

Также, чтобы устранить путаницу с обратными слешами в конечной строке, это просто визуальное недопонимание, как вы можете видеть ниже, использование двух обратных косых черт неприводят к двум обратным слешам в конечной строке.

enter image description here

Вторая ошибка в приведенном выше коде - использование функции кортежа, которая возвращает объект кортежа вместо строкиприложенная форма списка.Следующий код должен работать для вас.

def customTuple(arr):
    arr = ["'"+item+"'" for item in arr]
    s = '('+','.join(arr)+')'
    return s
myList = ['PREFIX\\000\\000923', 'PREFIX\\000\\000CS3'] # <- strings I have troubles with
myTuple = customTuple(myList)
query = "SELECT * FROM public.items WHERE name IN {}".format(myTuple)
print(query)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...