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

从OrderedDict生成MySQL INSERT语句仅获取单个字符,寻求解决方案

问题分析与解决方案

看起来你遇到的问题根源是遍历OrderedDict的方式不对——直接用enumerate(info)遍历OrderedDict时,默认只会迭代它的键,而不是键值对。所以循环里的p其实是单个字符串(OrderedDict的键),你用p[0]和p[1]自然就取到了键的前两个字符,而不是你想要的键值对内容。

修复步骤

  1. 正确遍历OrderedDict的键值对
    改用OrderedDict的.items()方法来获取键值对,它会返回形如(key, value)的元组。然后结合enumerate来生成自增的id:

    from collections import OrderedDict
    
    # 假设你的OrderedDict结构类似这样
    info = OrderedDict([("user_name", "Alice"), ("user_age", "28"), ("user_city", "London")])
    
    for id, (description, data_value) in enumerate(info.items()):
        format_str = """INSERT INTO asdf (id, description, data_value) VALUES ({id}, '{description}', '{data_value}');"""
        sql_command = format_str.format(id=id, description=description, data_value=data_value)
        print(sql_command)
    
  2. 强烈建议:使用参数化查询避免SQL注入
    你现在用字符串格式化拼接SQL语句存在严重的SQL注入风险,而且如果你的字符串里包含单引号(比如O'Neil),会直接导致SQL语法错误。改用MySQL的参数化查询更安全可靠:

    # 定义带占位符的SQL语句(MySQL用%s作为占位符)
    insert_sql = "INSERT INTO asdf (id, description, data_value) VALUES (%s, %s, %s);"
    
    for id, (description, data_value) in enumerate(info.items()):
        # 将参数以元组形式传入execute方法,数据库会自动处理转义
        cursor.execute(insert_sql, (id, description, data_value))
    # 别忘了提交事务
    conn.commit()
    

效果验证

如果你的OrderedDict是示例中的结构,修复后的代码会生成正确的INSERT语句,比如:

INSERT INTO asdf (id, description, data_value) VALUES (0, 'user_name', 'Alice');
INSERT INTO asdf (id, description, data_value) VALUES (1, 'user_age', '28');

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:13:46