在 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的主要内容,如果未能解决你的问题,请参考以下文章

在 Redshift 中将 null 插入整数类型列

在使用 VB.NET 的 Access 中将空字符串字段插入为 null

Laravel从表单输入中将“null”插入数据库。

在 Python 中将分区设置为 k 个组(包括 NULL 集)

如何在PostgreSQL中将空转换为null?

如何在mysql中将一列值作为静态插入?