Запрос к базе данных с параметрами Dynami c в python - PullRequest
0 голосов
/ 28 марта 2020

Я строю код для запроса базы данных, используя python. Ввод из словаря. Я написал код для передачи одного параметра (ключа) в запросе:

cursor = conn.execute("SELECT * FROM table1 WHERE param = '%s'" % kwargs['param'])

Количество элементов словаря, которые я собираюсь передать этой строке, может отличаться. Итак, после WHERE необходимо написать код для запроса всех ключей словаря к базе данных.

Мой код почти завершен, за исключением этой части. Пробовал Python Dynami c Параметризованный запрос . Но это бросает некоторые Операционные ошибки. Я использую sqlite3 здесь.

1 Ответ

1 голос
/ 28 марта 2020

Не видя сообщения об ошибке, я не могу быть уверен, что это за ошибка. Но вы не выполняли параметризованный запрос. Вы хотите выполнить запрос следующим образом:

Передача фактических значений в виде кортежа:

cursor = conn.execute("SELECT * FROM table1 WHERE param = %s", (kwargs['param'],))

Или передача фактических значения в виде списка:

cursor = conn.execute("SELECT * FROM table1 WHERE param = %s", [kwargs['param']])

Примечание:

  1. Кавычки ' вокруг параметров %s отсутствуют.
  2. Фактические значения для параметров %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)
...