在 Python 中将 Null 插入 SQLite3
Posted
技术标签:
【中文标题】在 Python 中将 Null 插入 SQLite3【英文标题】:Insert Null into SQLite3 in Python 【发布时间】:2013-12-11 07:01:52 【问题描述】:我正在尝试将 None
值插入到我的数据库的行条目中。表present
存在
db.execute("INSERT INTO present VALUES('test', ?, 9)", "This is a test!")
db.execute("INSERT INTO present VALUES('test2', ?, 10)", None)
但我得到一个错误:
ValueError: parameters are of unsupported type
如何为行中的第二个字段插入空白值?
【问题讨论】:
你试过 NULL 吗? @opalenzuela 传递 'NULL' 作为字符串而不是 None 对我有用。 【参考方案1】:使用元组,即:
db.execute("INSERT INTO present VALUES('test2', ?, 10)", (None,))
【讨论】:
【参考方案2】:上次测试时间:2018 年 8 月
Python 3.6.1 Python 2.7.10我不确定发布原始问题时是否是这种情况,但截至今天:
db.execute("INSERT INTO present VALUES('test', ?, 9)", "This is a test!")
抛出
sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 15 supplied.
运行时。
因为execute()
接受sql
——这是要执行的sql查询,而parameters
——是可迭代的,包含查询参数(目前Python 2和Python 3都是如此。因为字符串是可迭代的——它会相应地对待它。
Docs 明确指出,Python None
类型对应于 SQLite NULL
类型。
所以,正确的做法是:
db.execute("INSERT INTO present VALUES('test2', :null, 10)", 'null':None)
#or
db.execute("INSERT INTO present VALUES('test2', ?, 10)", (None,))
【讨论】:
带有元组的那个,(None,) 是正确的语法。 @redcartel,他们都正确地看到了# And this is the named style:
下的例子Python 2和Python 3。
你的问题是“这是一个测试!”是一个字符串,可迭代 15 个元素。 db.execute("INSERT INTO present VALUES('test', ?, 9)", ("This is a test!", ))
将是正确的格式,因为它将字符串转换为元组的单个元素,一个正确大小的迭代。 `["This is a test"] 也可以,一个元素的列表。【参考方案3】:
这里的问题是您提供的值应该在列表或元组中。第二个参数应该是一个可以迭代的集合(某种数组)。如果您提供一个集合,它将起作用,即使该集合中只有一个值。另一个问题出现了,因为字符串的行为类似于字符集合,并且可以迭代。因此,当您提供单个字符串而不将其放入集合本身时,它表示“集合”与绑定的数量(问号)相比太大了。字符串“这是一个测试!”长度为 15 个字符,当在其上使用 len() 函数时,它看起来像一个具有 15 个值的集合(数组)。所以 sqlite3 认为你已经传递了一个它想要的集合,但是集合的大小与你在查询中获得的绑定数量不匹配。
【讨论】:
以上是关于在 Python 中将 Null 插入 SQLite3的主要内容,如果未能解决你的问题,请参考以下文章
在使用 VB.NET 的 Access 中将空字符串字段插入为 null