SQLite3 executemany绑定数量异常求助:绑定数与实际不符
解决SQLite绑定参数数量不匹配问题
问题根源
你误用了executemany方法:
executemany的第二个参数要求是包含多行数据的可迭代对象,每行数据是对应字段数量的元组/列表。- 你直接传入了单个行数据的列表
values,sqlite3会将列表中的每个字符串视为独立的行参数序列,把字符串拆分成单个字符作为参数(比如第一个字符串长度为28,就会被解析成28个参数),导致参数数量与SQL语句的占位符不匹配。
解决方案
根据你的需求选择对应方法:
1. 插入单行数据:使用execute
如果只需要插入一行,直接替换executemany为execute即可,execute接受单个行数据序列作为参数:
cursor.execute("INSERT INTO test VALUES (?, ?, ?, ?, ?)", values)
2. 插入多行数据:正确构造executemany的参数
如果要插入多行,需要将每一行数据包装到外层列表中:
# 示例:插入两行数据 row1 = ['值1', '值2', '值3', '值4', '值5'] row2 = ['值6', '值7', '值8', '值9', '值10'] cursor.executemany("INSERT INTO test VALUES (?, ?, ?, ?, ?)", [row1, row2])
修改后的测试代码
import sqlite3 values = [' 19 850 000 Kč za nemovitost', ' včetně poplatků, včetně provize, včetně právního servisu', ' N6251', ' 29.09.2022', ' Cihlová'] def write(values): try: conn = sqlite3.connect(fr"C:\Users\halik\OneDrive\Dokumenty\GitHub\sws\code\test2.db") cursor = conn.cursor() print(sqlite3.version) cursor.execute('''CREATE TABLE IF NOT EXISTS test ("Celková cena:", "Poznámka k ceně:", "ID zakázky:", "Aktualizace:", "Stavba:")''') except Exception as e: print(e) quit() print(f"values is {values}") print(f"len(values) is {len(values)}") print(f"len((values,)) is {len((values,))}") # 替换为execute插入单行 cursor.execute("INSERT INTO test VALUES (?, ?, ?, ?, ?)", values) conn.commit() conn.close() write(values)
内容的提问来源于stack exchange,提问作者Honza Halík
相关产品推荐
相关产品推荐

