python - 将列表插入 SQLite3 单元格

标签 python sqlite

我是 python 新手,甚至是 SQL 新手,刚刚遇到以下问题:

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

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

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

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

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

最佳答案

SQLite 没有“嵌套”列的功能;您必须将列表存储为文本或二进制数据 block ;在传入时对其进行序列化,在传出时再次反序列化。

如何序列化为文本或二进制数据取决于您的用例。如果您的列表和字典仅包含文本、数字、 bool 值和 None(字典仅使用字符串作为键),则 JSON(通过 json module )可能适合。 JSON 受到多种其他语言的支持,因此您可以保持数据的合理兼容性。或者您可以使用pickle ,它允许您序列化为二进制格式,并且可以处理 Python 可以抛出的几乎任何内容,但它是 Python 特有的。

然后您可以 register an adapter处理序列化格式和 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 单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48467144/

相关文章:

python - 在 Python 中使用 Webbrowser 模块打开选项卡

python - 我需要在 python 中编写代码以使用指纹技术比较两个文档的文本

python - 检查有关年,月,日的错误

python - 获取两个列表之间的差异

python - 如何正确导入鼠尾草?

ios - sqlite3_prepare_v2 () - 没有这样的表

sql - 共享层次结构复制和 LEFT JOIN

android - 应用程序第一次升级 sqlite 数据库时崩溃

android - sqlite 失败无法从警报服务中的游标读取游标窗口的第 0 行 col -1

c++ - sqlite CREATE INDEX exec 返回错误