Как использовать оператор LIKE в параметризованном запросе используя библиотеку pymysql?
Оператор LIKE использует спецсимвол % как элемент регулярного выражения, например:
SELECT * FROM users WHERE bday_at LIKE '20%'
Этот же символ используется в библиотеке pymysql, при использовании параметризованных параметров, например:
cursor.execute('INSERT INTO messages (from_user_id, message) VALUES (%(id)s, %(text)s);', {'id': id, 'text': text})
Как быть, если нужно подставлять параметр в регулярное выражение оператора LIKE? Приведённый ниже код не работает, как и все вариации на тему, что удалось придумать.
cursor.execute("SELECT id FROM activities WHERE name LIKE %%(mark)s%;", {'mark': mark.lower()})
Можно конечно использовать f-строки и подставлять нужную часть непосредственно в запрос, но это плохая практика с точки зрения безопасности.
Ответы (2 шт):
Не знаю, возможно это костыль, но, во всяком случае работает
cursor.execute("SELECT id FROM activities WHERE name LIKE %(mark)s;", {'mark': f'%{mark.lower()}%'})
При необходимости использовать символ % в запросе используйте последовательность символов %%, например:
SELECT * FROM users WHERE bday_at LIKE '20%%'