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

Python mysql.connector中cursor.execute()的.format()与%s在MySQL JSON字段的使用对比

用format/f-string将JSON存入MySQL json字段的实现方案

嘿,我理解你想避开%s参数化占位符,改用字符串格式化(format或f-string)来处理JSON存入MySQL json字段的需求。先得给你提个关键提醒:直接用字符串格式化拼接SQL语句存在SQL注入风险,只有当你能100%确保传入的JSON内容是安全的(比如完全由你自己生成、无外部用户输入)时,才推荐这么做;如果涉及不可信数据,参数化查询(也就是你原来用的%s方式)依然是更安全的选择。

下面是满足你需求的具体实现方案:

方案1:转JSON字符串后直接格式化拼接

首先将Python的JSON对象(通常是字典)转换为标准JSON字符串,再用f-string或format拼入SQL语句,注意要用单引号包裹JSON字符串,让MySQL识别为json类型值:

import mysql.connector
import json

# 示例JSON对象(Python字典)
user_data = {"username": "Alice", "age": 30, "hobbies": ["reading", "hiking"]}
# 转换为JSON字符串
json_str = json.dumps(user_data)

# 用f-string拼接SQL语句
sql = f"INSERT INTO user_info (profile) VALUES ('{json_str}')"

# 执行SQL
conn = mysql.connector.connect(
    host="your_host",
    user="your_user",
    password="your_password",
    database="your_db"
)
cursor = conn.cursor()
cursor.execute(sql)
conn.commit()

# 关闭连接
cursor.close()
conn.close()

如果是更新操作,逻辑类似:

user_id = 1
new_profile = {"status": "active", "last_login": "2024-05-20"}
json_str = json.dumps(new_profile)

sql = f"UPDATE user_info SET profile = '{json_str}' WHERE id = {user_id}"
# 后续执行逻辑同上...

方案2:处理JSON中的单引号避免语法错误

如果JSON内容包含单引号(比如{"name": "O'Neil"}),直接拼接会导致SQL语法错误。这时可以手动将JSON字符串中的单引号替换为两个单引号(MySQL中用双单引号表示转义):

user_data = {"name": "O'Neil", "age": 28}
json_str = json.dumps(user_data).replace("'", "''")
sql = f"INSERT INTO user_info (profile) VALUES ('{json_str}')"

这样就能避免单引号破坏SQL语句结构,但依然无法完全防范SQL注入攻击,所以仅适用于安全可控的场景。

再次强调安全风险

如果你的JSON数据包含任何外部用户输入或不可信内容,绝对不要用字符串格式化拼接SQL!比如恶意输入{"name": "'); DROP TABLE user_info; --"}会直接删除你的数据表,后果严重。这种情况下,还是推荐你使用参数化查询:

sql = "INSERT INTO user_info (profile) VALUES (%s)"
cursor.execute(sql, (json_str,))

mysql.connector会自动处理参数转义和安全传递,既简单又安全。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:07:45