正在尝试插入NULL,其中None作为“?”占位符不适用于Python的sqlite3

正在尝试插入NULL,其中None作为“?”占位符不适用于Python的sqlite3,python,sqlite,Python,Sqlite,我正在使用sqlite3 for Python开发一个存储地址的数据库。我知道你用的是什么?作为占位符,并为execute方法提供一个元组或值列表来填充占位符。我还知道,没有一个应该对应于sqlite的空值 但是,如果我尝试像这样从表中选择,即使该条目在表中存在,它也不会获取任何值: cursor.execute('SELECT * FROM test WHERE (address, apartment, city, state) = (?, ?, ?, ?);',

我正在使用sqlite3 for Python开发一个存储地址的数据库。我知道你用的是什么?作为占位符,并为execute方法提供一个元组或值列表来填充占位符。我还知道,没有一个应该对应于sqlite的空值

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

cursor.execute('SELECT * FROM test WHERE (address, apartment, city, state) = (?, ?, ?, ?);',
               ('123 Front St', None, 'Springfield', 'WA'))
但是,如果公寓不是空值,并且我给它一个公寓的常规旧字符串,它将很好地获取它


我做错了什么?

您可以将查询重写为空安全的:

在SQL world中,col=NULL产生的未知值与true不同。
相关:

这会产生一个sqlite3.OperationalError:near DISTINCT:syntax错误。但是我看到我必须使用col IS NULL而不是=。看起来我只需要根据公寓是否为空生成一个或另一个查询。感谢您的编辑,sqlite版本工作正常。但是,我可能仍然决定动态生成查询。必须复制元组中的每个占位符值对我的大脑来说似乎比只进行一个或另一个查询更笨拙。NULL=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)
  ...