如何使用MySQL更新列中的JSON数据,替换listings字段?
解决JSON列listings字段替换问题
原语句的问题
你之前写的SQL有两个核心问题:
- 直接把Python的
dict变量拼进SQL字符串,会导致MySQL收到的不是合法JSON格式(Python dict用单引号,而JSON要求双引号),而且会触发SQL语法错误。 - 这种字符串拼接方式存在SQL注入风险,绝对不推荐。
正确的实现方式
方法1:用参数化查询(推荐,安全可靠)
不管你用的是pymysql还是mysql-connector-python,都应该用参数化查询来传递JSON数据,Python会自动把dict序列化为合法的JSON字符串:
# 示例:基于pymysql的实现 import pymysql # 数据库连接(自行替换你的配置) conn = pymysql.connect(host='你的主机地址', user='用户名', password='密码', db='数据库名') cursor = conn.cursor() # 准备要更新的数据 target_listing = response['listings'][0] product_id = str(id) # 参数化SQL语句,避免手动拼接的风险 sql = "UPDATE products SET column_name = JSON_REPLACE(column_name, '$.listings', %s) WHERE id = %s" # 执行查询,直接传入dict和ID,驱动会自动处理JSON序列化 cursor.execute(sql, (target_listing, product_id)) # 提交事务并关闭连接 conn.commit() cursor.close() conn.close()
方法2:手动序列化JSON后拼接(不推荐,仅作参考)
如果一定要用字符串拼接,必须先把Python dict序列化为标准JSON字符串:
import json # 把dict转成标准JSON字符串 target_listing_json = json.dumps(response['listings'][0]) product_id = str(id) # 用单引号包裹JSON字符串,避免和SQL的双引号冲突 sql = f"UPDATE products SET column_name = JSON_REPLACE(column_name, '$.listings', '{target_listing_json}') WHERE id = '{product_id}'" # 执行SQL(注意:此方式仍有SQL注入风险,仅应急使用)
验证替换结果
执行更新后,可以用以下SQL确认替换是否成功:
SELECT column_name->>'$.listings' FROM products WHERE id = '你的产品ID';
内容的提问来源于stack exchange,提问作者kaann.gunerr
相关产品推荐
相关产品推荐

