如何使用psycopg2向PostgreSQL插入JSON数据并解决单引号语法错误
问题根源
你当前的报错本质是两个问题叠加:
- 直接使用f字符串拼接SQL,没有处理字符串内单引号的转义,PostgreSQL的单引号转义规则是用两个连续单引号替换单个单引号,而非反斜杠转义,所以你加反斜杠的操作无效
- 手动拼接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
相关产品推荐
相关产品推荐

