psycopg2更新JSON列时如何转义单引号?
解决PostgreSQL 9.2中JSON列更新时的单引号问题
你的问题根源在于直接用字符串格式化拼接SQL语句,当JSON里包含单引号时,会破坏SQL的语法结构——比如"women's shoes"里的单引号会让数据库把SQL解析成不完整的字符串,导致执行失败,同时这种写法还存在SQL注入风险。
好在即使PostgreSQL 9.2没有JSON函数支持,我们可以通过Python的数据库适配器(比如psycopg2)提供的参数化查询来完美解决这个问题,不需要手动处理转义。
修改后的代码
import json criteria_str = json.dumps(criteria) # 使用参数占位符,不要直接用%格式化SQL sql_str = """update user_saved_search_backup set criteria = %s::json where id = %s;""" # 把参数作为execute的第二个参数传入,适配器会自动处理转义 write_cursor.execute(sql_str, (criteria_str, id))
为什么这个方法有效?
- psycopg2会自动识别字符串中的特殊字符(比如单引号),并进行安全转义,确保SQL语法正确,比如
"women's shoes"会被处理成数据库能正确解析的格式。 - 参数化查询是操作数据库的标准安全实践,从根源上避免了SQL注入问题,比手动转义可靠得多。
- 这个方案完全适配PostgreSQL 9.2,不需要依赖任何高版本的JSON函数。
为什么原来的写法会出错?
当你用%格式化SQL时,生成的语句会变成:
update user_saved_search_backup set criteria = '{"keyword": "women's shoes"}'::json where id = 123;
这里women's里的单引号会提前闭合字符串,剩下的 shoes"}'::json...就会变成无效的SQL语法,导致执行报错。
内容的提问来源于stack exchange,提问作者Alex




