在Python中将Null插入SQLite3

时间:2013-11-26 08:33:28

标签: python sqlite sql-insert

我正在尝试将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

如何为行中的第二个字段插入空白值?

3 个答案:

答案 0 :(得分:24)

使用元组,I.E。:

db.execute("INSERT INTO present VALUES('test2', ?, 10)", (None,))

答案 1 :(得分:1)

上次测试时间: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,))

答案 2 :(得分:0)

这里的问题是,您提供的值应该在列表或元组中。第二个参数应该是可以迭代的集合(某种数组)。如果您提供一个集合,即使该集合中只有一个值,它也将起作用。尽管出现另一个问题,因为字符串的行为类似于字符的集合,并且可以被迭代。因此,当您提供单个字符串而不将其放入集合本身时,它表示“集合”与绑定数(问号)相比太大。字符串“这是一个测试!”长度为15个字符,当在其上使用len()函数时,它看起来像具有15个值的集合(数组)。因此sqlite3认为您已根据需要传递了一个集合,但是该集合的大小与查询中获得的绑定数不匹配。