PostgreSQL更新JSON字段报错:Token 'True'无效的解决咨询
修复PostgreSQL JSON字段更新问题及替代方案
修复当前代码的问题
你当前报错的核心原因是:Python的布尔值True转字符串后是大写形式,但JSON规范要求布尔值必须是小写的true/false,手动替换单引号的方式无法处理这个格式差异。
正确的做法是用Python标准库的json模块序列化字典,同时使用参数化查询避免格式错误和SQL注入风险:
import json # 假设a是已添加新键值对的字典 a_json = json.dumps(a) # 参数化查询让psycopg2自动处理类型转换 query = '''UPDATE table SET data = %s''' conn.cursor.execute(query, (a_json,)) conn.connection.commit()
json.dumps()会自动将Python的True转为JSON合法的true,生成标准JSON字符串;参数化查询则能确保PostgreSQL正确识别JSON类型。
其他更新PostgreSQL JSON字段的方法
无需将JSON数据拉到Python处理,直接用PostgreSQL内置的JSON操作函数更高效:
1. 使用jsonb_set或||操作符(推荐,适用于jsonb类型)
如果你的字段是jsonb类型(比json更灵活,推荐使用),可以直接在数据库层面修改:
- 添加单个键值对:
UPDATE table SET data = jsonb_set(data, '{index}', 'true'::jsonb) WHERE id = 你的记录ID;
- 批量添加/合并键值对:
UPDATE table SET data = data || '{"new": "data", "index": true}'::jsonb WHERE id = 你的记录ID;
||操作符会合并新旧JSON对象,重复键会用新值覆盖旧值。
2. 使用json_insert(适用于json/jsonb类型)
如果要插入新键且不覆盖已有键,可用json_insert:
UPDATE table SET data = json_insert(data, '{index}', true) WHERE id = 你的记录ID;
3. 字符串拼接(不推荐)
如果是json类型,也可以通过字符串拼接修改,但需要手动处理格式(比如确保原JSON末尾无多余逗号),容易出错,仅作参考:
UPDATE table SET data = concat(left(data::text, length(data::text)-1), ',"index":true}')::json WHERE id = 你的记录ID AND data::text NOT LIKE '%"index"%';
内容的提问来源于stack exchange,提问作者Leteers
相关产品推荐
相关产品推荐

