MySQL跨库插入数据代码报错,求正确的元组插入写法
问题分析与解决
你的代码存在几个核心问题:
- f-string嵌套单引号引发语法错误
- 直接拼接变量到SQL语句会导致语法异常,还存在SQL注入风险
- Cursor与连接对象的调用方式错误,
commit需调用连接对象的方法而非Cursor属性 - 第二种写法中,元组拼接会让SQL生成格式错误的参数结构
正确实现示例
假设你已建立源库连接source_conn和目标库连接target_conn,以下是两种可靠的插入写法:
逐行参数化插入
from mysql.connector.cursor import SSDictCursor # 使用目标库连接创建Cursor with target_conn.cursor(SSDictCursor) as cur: # 定义带占位符的SQL模板 insert_sql = "INSERT INTO `table` (value1, value2) VALUES (%s, %s)" for item in filas: # 提取要插入的参数值 params = (item['valueA'], item['valueB']) # 执行参数化查询 cur.execute(insert_sql, params) # 所有插入操作完成后统一提交,比逐行提交效率更高 target_conn.commit()
批量插入(大场景推荐)
如果数据量较大,用executemany批量插入能大幅提升效率:
from mysql.connector.cursor import SSDictCursor with target_conn.cursor(SSDictCursor) as cur: insert_sql = "INSERT INTO `table` (value1, value2) VALUES (%s, %s)" # 提前整理所有参数列表 params_list = [(item['valueA'], item['valueB']) for item in filas] # 批量执行插入 cur.executemany(insert_sql, params_list) target_conn.commit()
关键注意事项
- 参数化查询优先:MySQL用
%s作为参数占位符,避免直接拼接变量,既解决语法问题又杜绝SQL注入风险。 - 连接对象的commit:必须调用数据库连接对象(如
target_conn)的commit()方法,而非Cursor的关联属性。 - Cursor初始化:正确写法是
连接对象.cursor(光标类型),而非直接调用cursor2(SSDictCursor)(除非cursor2是你自定义的连接封装函数)。
内容的提问来源于stack exchange,提问作者Lucas Peck
相关产品推荐
相关产品推荐

