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

使用psycopg2向PostgreSQL的JSONB列插入数据报语法错误怎么解决?

错误核心原因

你遗漏了两个核心基础原理:

  1. 数据库操作禁止直接拼接内容到SQL语句,必须使用驱动提供的参数化查询能力:你用f-string把Python字典直接拼入SQL时,Python字典的字符串表示用单引号包裹键值,会和SQL的字符串边界单引号冲突,同时Python字典的字符串格式不符合JSON要求的双引号规范,直接触发语法错误,这种写法还存在SQL注入风险。
  2. psycopg2原生支持Python字典与PostgreSQL JSON/JSONB类型的自动适配,不需要手动做格式转换和类型强转。
    另外你代码里的参数传递完全错误:调用cur.execute(sql, (defaulturl))时传入的参数是defaulturl,和你要插入的js_body没有任何关联,参数化查询的功能完全没有用到。
修复方案

首先调整表结构,将id设为非空主键避免数据冗余混乱:

CREATE TABLE IF NOT EXISTS pokeapi
(id INTEGER PRIMARY KEY, body JSONB);

然后修改循环插入的逻辑:

for item in results:
    resp = requests.get(item['url'])
    js_body = resp.json() # requests自带JSON解析方法,无需手动调用json.loads
    # 使用参数化查询,%s为占位符,不要拼接任何内容到SQL字符串里
    sql = "INSERT INTO pokeapi (id, body) VALUES (%s, %s)"
    # 直接将宝可梦ID和解析后的字典作为参数传入execute即可,psycopg2会自动处理类型适配
    cur.execute(sql, (js_body['id'], js_body))

内容的提问来源于stack exchange,提问作者Israel Phiri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 11:15:03