Python cx_Oracle插入DataFrame至Oracle数据库时出现TypeError:函数最多接受2个参数(传入了3个)问题求助
解决Oracle插入DataFrame时的TypeError: function takes at most 2 arguments (3 given)问题
嘿,这个问题我太熟悉了!你碰到的这个错误根源很简单——就是cursor.execute()的参数传递方式错了。
错误原因
cursor.execute()方法只接受两个核心参数:第一个是SQL语句字符串,第二个是包含所有占位符值的序列(元组、列表都行)。你现在把row.TMIDS和row.MEM_ID作为两个单独的参数传进去,相当于给execute()塞了3个参数(SQL字符串 + 两个单独的值),这就触发了“参数过多”的报错。
修正后的代码(循环版)
只需要把两个值打包成一个元组,作为第二个参数传递就行:
cursor = connection.cursor() print("connection successful") for index, row in df.iterrows(): # 关键:把参数打包成元组,作为execute的第二个参数 cursor.execute("INSERT INTO UCIDBA.dummy_table (TMIDS,MEM_ID) values(?,?)", (row.TMIDS, row.MEM_ID)) connection.commit() cursor.close() print("inserted in table")
更高效的批量插入方案(推荐)
用iterrows()循环一行行插入效率很低,尤其是数据量大的时候。推荐用executemany()一次性批量插入,速度会快很多:
cursor = connection.cursor() print("connection successful") # 把DataFrame转换成元组列表,每个元组对应一行数据 data_list = [tuple(row) for _, row in df.iterrows()] # 一次性执行批量插入 cursor.executemany("INSERT INTO UCIDBA.dummy_table (TMIDS,MEM_ID) values(?,?)", data_list) connection.commit() cursor.close() print("inserted in table")
额外小提示
有些Oracle数据库驱动更习惯用位置占位符:1、:2而不是?,如果上面的代码还是有问题,可以试试把SQL语句改成:
INSERT INTO UCIDBA.dummy_table (TMIDS,MEM_ID) values(:1,:2)
参数传递方式不变,依然用元组就行。
内容的提问来源于stack exchange,提问作者alok sharma
相关产品推荐
相关产品推荐

