执行INSERT语句遇TypeError:字符串格式化参数未全部转换求助
问题解决:TypeError: not all arguments converted during string formatting
你的错误根源是同时混用了两种SQL参数传递方式,导致参数不匹配:
错误原因
你在cur.execute里先通过%r把row直接格式化进SQL语句,又把row作为第二个参数传给execute。execute会尝试用这个参数去替换SQL里的占位符,但此时SQL语句里已经没有占位符了,自然会报参数转换不全的错误。
正确写法(二选一)
写法1:使用参数绑定(推荐,防SQL注入)
不要自己手动格式化SQL,用数据库驱动自带的参数占位符,根据row的长度生成对应数量的%s占位符:
for row in csv_data: if skipHeader: skipHeader = False continue row = tuple(row) # 根据row元素数量生成对应占位符 placeholders = ", ".join(["%s"] * len(row)) cur.execute(f"INSERT INTO july VALUES ({placeholders})", row)
写法2:仅用字符串格式化(不推荐,有SQL注入风险)
如果非要手动格式化,就不要传第二个参数,直接把格式化后的完整SQL传给execute:
for row in csv_data: if skipHeader: skipHeader = False continue row = tuple(row) cur.execute("INSERT INTO july VALUES %r" % row)
内容的提问来源于stack exchange,提问作者coding_upcomer
相关产品推荐
相关产品推荐

