将列表插入SQLite3单元格

c9x0cxw0  于 2023-05-07  发布在  SQLite
关注(0)|答案(1)|浏览(171)

我是python的新手,甚至是SQL的新手,刚刚遇到了以下问题:
我想在SQL数据库的单个单元格中插入一个列表(或者实际上是一个包含一个或多个字典的列表)。这是我的一行数据:

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

由于列表中的字典数量不同,并且我想稍后迭代列表中的元素,我认为将其保留在一个地方是有意义的(因此不会将列表拆分为单个元素)。但是,当我尝试按原样插入列表时,我得到以下错误:

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

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

1sbrub3j

1sbrub3j1#

SQLite没有用于“嵌套”列的工具;你必须将列表存储为 text 或二进制数据blob;在输入时序列化,在输出时反序列化。
如何序列化为文本或二进制数据取决于您的用例。JSON(通过json module可能是合适的,如果你的列表和字典只包含文本,数字,布尔值和None(字典只使用字符串作为键)。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并在列别名(SELECT datacol AS "datacol [json]" FROM ...)中使用[json]来触发加载时的转换。

相关问题