Динамический поиск нуля в SQL-запросе выбора с использованием Python - PullRequest
0 голосов
/ 22 ноября 2018

Я новичок в Python и хочу сделать запрос, подобный этому:

_c.execute('select * from cases where bi = ? and age = ? and 
            shape = ? and margin = ? and density = ?',(obj['bi'], 
            obj['age'], obj['margin'], obj['density']))

Когда некоторые параметры равны None, например obj['bi'] = None, запрос ищетстрока, когда bi = 'None'.Но я хочу, чтобы он искал строку, когда: 'bi is NULL'

Возможным решением является проверка значений параметров по одному в последовательности if-elses.Например:

query = 'select * from cases where'

if obj['bi'] is None:
   query += ' bi is null'
else:
   query += ' bi = ' + str(obj['bi']) + ' and '
    ...
# do the same if-else for the other parameters
    ...

_c.execute(query)

Но это не кажется мне лучшим решением.Вопрос в том, как лучше всего решить данную проблему и как избежать SQL-инъекций.

1 Ответ

0 голосов
/ 23 ноября 2018

Хорошо, после запуска REPL и немного поиграть с ним, все стало проще, чем я думал.Привязки Python sqlite превращают Python None в SQL NULL, а не в строку 'None', как это звучит, как в вашем вопросе.В SQL = не соответствует NULL значениям, но IS будет.Итак ...

Учитывая таблицу foo, которая выглядит следующим образом:

a     | b
--------------
NULL  | 1
Dog   | 2     

Выполнение:

c = conn.cursor()
c.execute('SELECT * FROM foo WHERE a IS ?', (None,))
print(c.fetchone())

вернет строку (NULL, 1) и

c.execute('SELECT * FROM foo WHERE a IS ?', ('Dog',))
print(c.fetchone())

вернет строку ('Dog', 2).

Другими словами, используйте IS, а не = в своем запросе.

...