Использование% в предложении like оператора select в python

import pypyodbc as pyodbc
model_name = 'test'
model_name1 = Master_Cursor.execute("select col1,col2,col3 from tablename where col3 like '%s' order by col3" %(model_name)).fetchall()

Приведенный выше код возвращает одну запись, соответствующую model_name = test, Как бы мне вернуть другие записи, имеющие model_name=123test123,abctestabc,ABCtestABC так далее??

В основном ищу

select col1,col2,col3 from tablename where col3 like '%test%'.

2 ответа

Решение
model_name1 = Master_Cursor.execute("select col1,col2,col3 from tablename where col3 like '%%%s%%' order by col3" %(model_name)).fetchall()

Используйте 2 процента, чтобы представить символ реального процента

Не используйте форматирование строк для вставки переменных в ваши запросы, это открывает вам риск внедрения SQL-кода (см., Например, Что такое SQL-внедрение?) Вместо этого, согласно документации, вы должны использовать ? представлять переменные в запросе, и позволить библиотеке выйти и вставить их соответствующим образом.

Далее, вам нужно включить подстановочные знаки вместе с model_name если вы хотите более слабое соответствие. На данный момент вы создаете:

select col1,col2,col3 from tablename where col3 like 'test' order by col3

Вы должны окружить model_name с подстановочными знаками перед передачей его в запрос, например, используя '%%%s%%' % model_name (обратите внимание, что вам нужно повторить каждый % чтобы избежать этого в printf -стиль форматирования) или один из более современных вариантов форматирования строки.

В этом случае, например (используя str.format):

model_name1 = Master_Cursor.execute(
    "select col1, col2, col3 from tablename where col3 like ? order by col3",
    ("%{}%".format(model_name),)
).fetchall()

Следующее должно работать:

pattern = "%"+model_name+"%"
db.execute("select col1,col2,col3 from tablename where col3 like :s order by col3" ,{"s":pattern}).fetchall()
Другие вопросы по тегам