JSON 插入错误,Sqlite3,Python

0 投票
3 回答
562 浏览
提问于 2025-04-18 01:23

我正在尝试使用Python中的sqlite3模块将原始的JSON字符串插入到sqlite数据库中。

当我执行以下操作时:

rows = [["a", "<json value>"]....["n", "<json_value>"]]
cursor.executemany("""INSERT OR IGNORE INTO FEATURES(UID, JSON) VALUES(?, ?)""", rows)

我遇到了以下错误:

sqlite3.ProgrammingError: 绑定的数量不正确。当前语句需要2个,但提供了48个。

我该如何将原始的JSON插入到表中呢?我猜可能是JSON字符串中的逗号导致的问题。

我该如何解决这个问题呢?

3 个回答

-2

这有点不太靠谱……不过你可以试着把JSON的值加上引号,这样可以确保解析的时候能正常工作:

cursor.executemany("""INSERT OR IGNORE INTO FEATURES(UID, JSON) VALUES(?, '?')""", rows)

编辑:另外……这样做可能会把json强制转换成字符串在插入的时候?

rows = [ uid, '"{}"'.format( json_val ) for uid, json_val in rows ]
cursor.executemany("""INSERT OR IGNORE INTO FEATURES(UID, JSON) VALUES(?, ?)""", rows)
-1

传给 executemany() 的第二个参数必须是一个元组的列表,而不是列表的列表:

[tuple(l) for l in rows]

来自 sqlite3 模块的文档:

在你想使用某个值的地方放一个 ? 作为占位符,然后把一个值的元组作为第二个参数传给游标的 execute() 方法。

同样的规则也适用于 executemany()

0

你的输入被理解为一个字符列表(这里的“48个”就是指的这个 - 48是<json value>字符串的长度)。

如果你把输入用方括号包起来,就可以把它当作字符串传入,像这样:

["<json value>"]

整行看起来就会是这样:

rows = [["a", ["<json value>"]]....["n", ["<json value>"]]]

撰写回答