MySQL UPSERT操作报错InterfaceError:SQL语句未使用全部参数
解决MySQL UPSERT操作的InterfaceError参数未用完问题
问题根源
你当前的UPSERT SQL语句定义了6个%s占位符,虽然尝试通过拼接列表生成对应参数,但冗余的写法容易引发参数传递格式问题。更高效的方式是利用MySQL原生语法复用插入值,避免重复传参。
修正方案
优化SQL语句(推荐)
修改ON DUPLICATE KEY UPDATE部分,用VALUES(列名)直接引用INSERT子句中对应列的值,这样仅需传递3个参数,和普通INSERT操作的参数格式完全一致:
data = {'codice_utente' : ['100003710190666-G5'] , 'user_id' :[ '100003710190666'] , 'mail' : ['prova@ciao.com'] } df= pd.DataFrame(data= data ) # 优化后的UPSERT语句,复用插入阶段的参数 query = ''' INSERT INTO dw_users(codice_utente, user_id, mail) VALUES ( %s , %s , %s ) ON DUPLICATE KEY UPDATE codice_utente = VALUES(codice_utente), user_id = VALUES(user_id), mail = VALUES(mail); ''' # 参数格式和普通INSERT一致,无需额外拼接 val = df.values.tolist() my_sql_cursor.executemany(query, val) connection.commit()
保留原SQL写法的修正(不推荐)
如果坚持使用原有的6个占位符写法,需确保每个参数组是包含6个元素的列表,同时符合executemany的参数格式要求:
data = {'codice_utente' : ['100003710190666-G5'] , 'user_id' :[ '100003710190666'] , 'mail' : ['prova@ciao.com'] } df= pd.DataFrame(data= data ) query = 'INSERT INTO dw_users(codice_utente, user_id, mail) VALUES ( %s , %s , %s ) ON DUPLICATE KEY UPDATE codice_utente=%s , user_id=%s , mail=%s ;' # 生成包含6个元素的参数组 row = df.values.tolist()[0] val = [row + row] my_sql_cursor.executemany(query, val) connection.commit()
额外注意事项
- 确保
dw_users表存在主键或唯一索引,否则ON DUPLICATE KEY UPDATE逻辑不会触发(这是UPSERT功能生效的前提)。 - 优先选择第一种优化方案,既能减少参数传递冗余,又能降低出错概率,提升代码可读性。
内容的提问来源于stack exchange,提问作者Marco Viganò
相关产品推荐
相关产品推荐

