Python写入SQL文件时如何正确转义SQL语句?
在Python中生成MySQL可执行SQL文件时正确转义字符串的方法
要生成能被MySQL客户端正确执行的SQL文件,核心是利用MySQL官方驱动(如mysql-connector-python或MySQLdb)提供的转义工具,不要手动拼接字符串处理转义,避免遗漏特殊字符。
方法1:使用连接对象的转义函数
MySQL驱动的连接对象自带专门的字符串转义方法,会根据数据库的字符集和规则处理所有需要转义的内容(比如单引号、反斜杠、换行符等)。
错误示例(手动拼接导致无效SQL)
# 错误:直接拼接未转义的字符串,生成的SQL会因单引号报错 user_name = "O'Neil" invalid_sql = f"INSERT INTO users (name) VALUES ('{user_name}');" # 生成的SQL:INSERT INTO users (name) VALUES ('O'Neil');
修正后的代码
import mysql.connector # 建立数据库连接(仅用于转义,无需执行查询) conn = mysql.connector.connect( host="你的主机地址", user="你的用户名", password="你的密码", database="你的数据库名" ) user_name = "O'Neil" # 用连接对象的escape_string方法转义字符串 escaped_name = conn.escape_string(user_name) valid_sql = f"INSERT INTO users (name) VALUES ('{escaped_name}');" # 生成的SQL:INSERT INTO users (name) VALUES ('O\'Neil'); # 将SQL写入文件 with open('insert_users.sql', 'w', encoding='utf-8') as f: f.write(valid_sql + '\n') conn.close()
方法2:使用cursor.mogrify生成完整转义的SQL(更推荐)
cursor.mogrify()方法会将参数化查询模板和参数结合,直接返回已经转义好的完整SQL语句,这种方式更安全,能避免手动拼接可能出现的错误。
import mysql.connector conn = mysql.connector.connect(...) cursor = conn.cursor() # 定义参数化查询模板 sql_template = "INSERT INTO users (name, email) VALUES (%s, %s);" user_data = ("O'Neil", "oneil@example.com") # 生成转义后的完整SQL final_sql = cursor.mogrify(sql_template, user_data) # 写入文件(注意解码字节串为字符串) with open('batch_insert.sql', 'w', encoding='utf-8') as f: f.write(final_sql.decode('utf-8') + '\n') cursor.close() conn.close()
关键注意事项
- 不要手动替换单引号(比如
user_name.replace("'", "\\'")):这种方式只能处理单引号,无法覆盖所有MySQL需要转义的特殊字符(如\n、\t、\等),容易出现隐藏问题。 - 必须建立有效连接:转义函数依赖数据库连接的字符集配置,确保转义后的字符串符合目标数据库的字符编码规则。
内容的提问来源于stack exchange,提问作者philipp
相关产品推荐
相关产品推荐

