Не видя сообщения об ошибке, я не могу быть уверен, что это за ошибка. Но вы не выполняли параметризованный запрос. Вы хотите выполнить запрос следующим образом:
Передача фактических значений в виде кортежа:
cursor = conn.execute("SELECT * FROM table1 WHERE param = %s", (kwargs['param'],))
Или передача фактических значения в виде списка:
cursor = conn.execute("SELECT * FROM table1 WHERE param = %s", [kwargs['param']])
Примечание:
- Кавычки
'
вокруг параметров %s
отсутствуют. - Фактические значения для параметров
%s
предоставляются в виде списка или кортежа.
Обратите внимание, что при передаче фактического значения в кортеже кортеж указывается как (kwargs['param'],)
, Выражение (kwargs['param'])
(без запятой) будет интерпретироваться как простой термин с круглыми скобками, а не как кортеж, поэтому запятая в конце требуется, когда у вас есть одно значение.
You делали текстовую замену kwargs['param']
на %s
, а затем окружали результат кавычками, что совсем другое (что, если kwargs['param']
содержал одну кавычку?). И, в зависимости от источника kwargs['param']
, вы оставите себя открытым для атаки SQL Injection (вам следует изучить эту топи c).
Обновление
Если у вас есть словарь, kwargs
, ключами которого являются имена столбцов, которые будут использоваться в предложении WHERE
, например:
kwargs = {'param1': 1, 'param2': 'a', 'param3': 'x'}
, тогда:
>>> kwargs = {'param1': 1, 'param2': 'a', 'param3': 'x'}
>>> where_clause = 'WHERE ' + ' AND '.join(['`' + k + '` = %s' for k in kwargs.keys()])
>>> where_clause
'WHERE `param1` = %s AND `param2` = %s AND `param3` = %s'
>>> values = list(kwargs.values())
>>> values
[1, 'a', 'x']
И так получаем:
where_clause = 'WHERE ' + ' AND '.join(['`' + k + '` = %s' for k in kwargs.keys()])
values = list(kwargs.values())
sql = "SELECT * FROM table1 " + where_clause
cursor.execute(sql, values)