使用psycopg2向PostgreSQL的JSONB列插入数据报语法错误怎么解决?
错误核心原因
你遗漏了两个核心基础原理:
- 数据库操作禁止直接拼接内容到SQL语句,必须使用驱动提供的参数化查询能力:你用f-string把Python字典直接拼入SQL时,Python字典的字符串表示用单引号包裹键值,会和SQL的字符串边界单引号冲突,同时Python字典的字符串格式不符合JSON要求的双引号规范,直接触发语法错误,这种写法还存在SQL注入风险。
- 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
相关产品推荐
相关产品推荐

