You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQLite单元格存入字典列表并原样取出及解决格式报错

问题解决步骤

1. 关于查询结果里的括号和逗号

你看到的[('[{"id":"9",...}]',)]是Python中列表套单元素元组的表现形式:

  • 外层的[]是fetchall()返回的结果列表,每一个元素对应数据库中的一行数据
  • 内层的()是元组,因为你查询了一列,所以是单元素元组,Python中规定单元素元组必须加末尾逗号来区分普通括号,这个逗号不是数据本身的内容

2. 解决"malformed node or string"错误

错误原因是你直接对整个结果列表/元组用ast.literal_eval(),而不是先提取出里面的JSON字符串。另外,处理JSON字符串优先用json.loads(),比ast.literal_eval()更适配JSON语法(比如JSON的字符串强制双引号,json模块原生支持)。

3. 修正后的代码示例

import json, sqlite3, pprint

list1 = [{'id': '9', 'name': 'Buiding'},
         {'id': '10', 'name': 'Security'},
         {'id': '11', 'name': 'Mass Media'},
         {'id': '12', 'name': 'Consulting'},
         {'id': '13', 'name': 'Medical care'}]

conn = sqlite3.connect('test.db')
c = conn.cursor()

# 建表(SQLite的json类型本质是TEXT类型的别名)
c.executescript("DROP TABLE IF EXISTS result; CREATE TABLE result (data json)")
# 插入JSON字符串
c.execute("insert into result values (?)", [json.dumps(list1)])
conn.commit()

# 查询数据:直接取data列即可,json_extract在这里没必要
cursor_result = c.execute("select data FROM result;").fetchall()
conn.close()

# 提取JSON字符串并解析回字典列表
# 取第一行的第一个元素(因为只有一行一列)
json_str = cursor_result[0][0]
original_list = json.loads(json_str)

pprint.pprint(original_list)

运行后会输出和原始list1完全一致的字典列表:

[{'id': '9', 'name': 'Buiding'},
 {'id': '10', 'name': 'Security'},
 {'id': '11', 'name': 'Mass Media'},
 {'id': '12', 'name': 'Consulting'},
 {'id': '13', 'name': 'Medical care'}]

额外提示

  • SQLite的json类型只是语法糖,底层还是存储文本,所以插入时用json.dumps()转字符串,取出时用json.loads()解析是标准流程
  • 如果你需要用SQLite的JSON函数(比如json_extract)查询JSON内部的字段,那才需要用到这类函数,单纯存整个列表的话直接存取字符串更简单

内容的提问来源于stack exchange,提问作者yndolokop pavel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 05:35:23