在SQLite3单元格中插入列表

3

我是Python的新手,对SQL更是一窍不通,遇到了以下问题:

我想将一个列表(或者实际上包含一个或多个字典的列表)插入到我的SQL数据库的单个单元格中。这是我的数据中的一行:

[a,b,c,[{key1: int, key2: int},{key1: int, key2: int}]]

由于字典列表中的字典数量不同,而我希望稍后可以迭代列表的元素,因此我认为将其保存在一个地方(因此不要将列表拆分为其单个元素)是有意义的。然而,在尝试按原样插入列表时,我遇到了以下错误:

sqlite3.InterfaceError: Error binding parameter 2 - probably unsupported type.

这种列表如何插入到我的SQL数据库的单个单元格中?

将列表转换为字符串格式是否可接受?例如,JSON格式? - undefined
你应该展示你的插入代码。使用SQLite,你会将其存储为文本字符串,这对于存储来说是可以的,但如果你想在以后使用SQL来查询数据,比如根据特定的键值进行查询,那就不是正确的方法。 - undefined
1个回答

2
SQLite没有支持“嵌套”列的功能;您需要将列表存储为文本或二进制数据块,在导入时进行序列化,在导出时进行反序列化。
如何将其序列化为文本或二进制数据取决于您的用例。如果您的列表和字典仅包含文本、数字、布尔值和None(字典仅使用字符串作为键),则可以考虑使用 JSON(通过json模块)。JSON受到许多其他语言的支持,因此可以保持数据的合理兼容性。或者您可以使用pickle,它可以将对象序列化为二进制格式,并能处理几乎任何Python能够处理的内容,但它是特定于Python的。
然后,您可以注册一个适配器来处理序列化格式与Python列表之间的转换。
import json
import sqlite3

def adapt_list_to_JSON(lst):
    return json.dumps(lst).encode('utf8')

def convert_JSON_to_list(data):
    return json.loads(data.decode('utf8'))

sqlite3.register_adapter(list, adapt_list_to_JSON)
sqlite3.register_converter("json", convert_JSON_to_list)

然后连接使用detect_types=sqlite3.PARSE_DECLTYPES,并声明你的列类型为json,或者使用detect_types=sqlite3.PARSE_COLNAMES并在列别名中使用[json]SELECT datacol AS "datacol [json]" FROM ...)来在加载时触发转换。

我在谷歌上搜索了“如何将列表放入Python中的sqlite3单元格”,找到了这篇非常有帮助的帖子,这让我感到惊讶,因为谷歌通常没什么用。但我的观点是,你导入的名称是sqlite,但后来使用了sqlite3,虽然这只是一个小疏忽,但你的示例明显无法正常工作。它已经收到了一个赞同和接受,但这个错误已经存在了五年以上!而且你曾经编辑过它,但没有修复这个问题!人们通过谷歌被引导到这里,不太懂技术的人将无法修复它。所以我决定给你点个踩并通知你。 - undefined
请编辑您的回答以更正我提到的错误,这样我就可以撤销我的负评。当您这样做时,请@我,我会撤销我的负评。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接