Python实现带转义字符的MySQL插入查询(Access数据迁移场景)
问题根源
你当前的函数出现字段忽略问题,不是转义规则的问题,是代码本身存在3处明显错误:
- 处理带单引号的字段时,你初始化
string = "",没有把当前字段值dict[key]赋值给string,循环空字符串自然生成不了有效值 - 处理完转义后,你给
vl赋值时直接用了=而不是+=,会覆盖之前已经拼接好的其他字段值 - 使用Python内置关键字
dict作为参数名,容易引发命名冲突
单引号转义规则
MySQL中单引号转义有两种合法写法:
- 转成两个连续单引号
''(兼容性最好,不受SQL模式影响,更推荐) - 转成反斜杠加单引号
\'(需要确保MySQL没有开启NO_BACKSLASH_ESCAPES模式)
以D'Amelio为例,转义后应该写成'D''Amelio',生成的SQL可以直接在MySQL中执行。
优化后的函数代码
def dictionary_output(data): # 初始化主键id的字段和值 fields = ["id"] values = [f"'{id_gen()}'"] for key, val in data.items(): val_str = str(val) # 跳过空值和None if val_str in ('None', ''): continue fields.append(str(key)) # 单引号转义,直接用replace方法比手动遍历更高效 escaped_val = val_str.replace("'", "''") values.append(f"'{escaped_val}'") # 拼接SQL语句,避免手动处理末尾逗号的问题 fields_part = f"({', '.join(fields)})" values_part = f"({', '.join(values)})" return f"INSERT into lefm_customers {fields_part} values {values_part};"
额外建议
如果你的迁移脚本是在生产环境使用,或者涉及不可信的输入数据,不要手动拼接SQL语句,改用MySQL Python驱动自带的参数化查询功能,能完全避免SQL注入风险,也不需要自己处理转义逻辑。
内容的提问来源于stack exchange,提问作者NPGuy
相关产品推荐
相关产品推荐

