如何在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
相关产品推荐
相关产品推荐

