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

如何使用psycopg2向PostgreSQL插入JSON数据并解决单引号语法错误

问题根源

你当前的报错本质是两个问题叠加:

  1. 直接使用f字符串拼接SQL,没有处理字符串内单引号的转义,PostgreSQL的单引号转义规则是用两个连续单引号替换单个单引号,而非反斜杠转义,所以你加反斜杠的操作无效
  2. 手动拼接SQL本身就存在SQL注入风险,还需要额外处理数据类型转换(比如None转null、布尔值适配、字符串加引号等),非常容易出问题

解决方案(官方推荐)

直接使用psycopg2原生的参数化查询能力,它会自动处理所有特殊字符转义、数据类型适配工作,不需要你手动做任何转义、替换操作:

# 定义SQL模板,所有值的位置用%s作为占位符
insert_sql = """
INSERT INTO deleted_tweets(
    id, user_name, content, deleted, created, modified, tweet,
    politician_id, approved, reviewed, reviewed_at, review_message,
    retweeted_id, retweeted_content, retweeted_user_name
) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
"""

# 按占位符顺序整理参数,不需要做任何转义、替换处理
params = (
    row['id'], row['user_name'], row['content'], bool(row['deleted']),
    row['created'], row['modified'], row['tweet'], row['politician_id'],
    bool(row['approved']), bool(row['reviewed']), row['reviewed_at'],
    row['review_message'], row['retweeted_id'], row['retweeted_content'],
    row['retweeted_user_name']
)

# 执行时传入SQL模板和参数列表即可
cursor.execute(insert_sql, params)

补充说明

如果确实需要手动拼接SQL(极端不推荐),你需要把所有字符串中的单引号替换为两个单引号,同时还要给所有字符串值外层套单引号、处理None转null等逻辑,远不如参数化查询稳妥。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 17:48:04