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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 10:00:24