Попытка вставить NULL с None как '?' заполнитель не работает для sqlite3 для Python - PullRequest
1 голос
/ 26 июня 2019

Я работаю над базой данных, используя sqlite3 для Python, в которой хранятся адреса. Я понимаю, что вы используете ? в качестве заполнителя и даете методу execute кортеж или список значений для заполнения заполнителей. Мне также известно, что None должно соответствовать значению NULL sqlite.

Однако, если я попытаюсь SELECT из таблицы следующим образом, даже если эта запись существует в таблице, она не извлекает никаких значений:

cursor.execute('SELECT * FROM test WHERE (address, apartment, city, state) = (?, ?, ?, ?);',
               ('123 Front St', None, 'Springfield', 'WA'))

Однако, если квартира не является NULL значением, и я даю ей обычную старую строку для квартиры, она будет просто получать ее.

Что я делаю не так?

1 Ответ

2 голосов
/ 26 июня 2019

Вы можете переписать запрос, чтобы он был NULL безопасным:

-- ISO-standard
SELECT * 
FROM test 
WHERE address IS NOT DISTINCT FROM ?
  AND apartment IS NOT DISTINCT FROM ?
  AND city IS NOT DISTINCT FROM ?
  AND state US NOT DISTINCT FROM ?;

-- SQLite
SELECT * 
FROM test 
WHERE (address = ? OR ? IS NULL)
  AND (apartment = ? OR ? IS NULL)
  ...

В мире SQL col = NULL выдает Unknown, который отличается от true. Связано: что такое «= ноль» и «НУЛЬ»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...