尝试插入无为'?'的NULL占位符不适用于sqlite3 for Python

时间:2019-06-25 21:51:49

标签: python sqlite

我正在使用使用sqlite3 for Python存储地址的数据库。我们了解您使用?作为占位符,并且为execute方法提供了一个元组或值列表来填充占位符。我还知道None应该与sqlite的NULL值相对应。

但是,如果我尝试像这样从表中SELECT,即使该条目确实存在于表中,它也不会获取任何值:

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

但是,如果该公寓不是一个NULL值,并且我给它指定了公寓的常规旧字符串,则可以很好地获取它。

我在做什么错了?

1 个答案:

答案 0 :(得分:2)

您可以重写查询以确保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不同。 相关:what is “=null” and “ IS NULL