如何向SQLite3插入数字序列?解决TypeError报错问题
解决SQLite3 executemany插入数据时的TypeError问题
咱们先来拆解你遇到的错误:TypeError: 'int' object is not iterable,问题出在executemany()方法的使用逻辑上。
错误原因
cursor.executemany()的设计目的是批量插入多条数据,它要求第二个参数是一个可迭代的参数集合(比如列表、元组,其中每个元素又是对应SQL占位符的小元组/列表)。而你在循环里直接传了单个整数x,Python尝试遍历这个整数来生成插入数据时,自然会报错——整数可不是可迭代对象呀。
两种修正方案
方案1:用executemany批量插入(推荐,效率更高)
既然要插入一个数字序列,咱们可以一次性生成所有待插入的数据集合,然后传给executemany(),不用写循环:
import sqlite3 connector = sqlite3.connect("Database_1.db") cursor = connector.cursor() def Table_making(): cursor.execute("CREATE TABLE IF NOT EXISTS Tester(Tester_1 INT)") def data_entry(): # 生成包含所有数据的元组列表:每个元素是(数字,)这样的单元素元组 data_list = [(x,) for x in range(1, 10)] cursor.executemany("INSERT INTO Tester(Tester_1) VALUES(?)", data_list) connector.commit() cursor.close() connector.close() Table_making() data_entry()
方案2:循环中用execute插入单条数据
如果更习惯逐条插入的逻辑,那应该用cursor.execute()而不是executemany(),每次传入对应单条数据的参数元组(注意逗号不能少,否则会被当成单个整数而非元组):
import sqlite3 connector = sqlite3.connect("Database_1.db") cursor = connector.cursor() def Table_making(): cursor.execute("CREATE TABLE IF NOT EXISTS Tester(Tester_1 INT)") def data_entry(): for x in range(1, 10): cursor.execute("INSERT INTO Tester(Tester_1) VALUES(?)", (x,)) connector.commit() cursor.close() connector.close() Table_making() data_entry()
额外优化建议:用上下文管理器自动管理连接
手动关闭游标和连接容易出错,推荐使用with语句(上下文管理器)来自动处理连接的打开、提交和关闭,代码更简洁可靠:
import sqlite3 def Table_making_and_insert(): with sqlite3.connect("Database_1.db") as connector: cursor = connector.cursor() cursor.execute("CREATE TABLE IF NOT EXISTS Tester(Tester_1 INT)") # 批量插入数据 data_list = [(x,) for x in range(1, 10)] cursor.executemany("INSERT INTO Tester(Tester_1) VALUES(?)", data_list) # with块结束后,连接会自动提交并关闭,无需手动操作 Table_making_and_insert()
内容的提问来源于stack exchange,提问作者user9342203
相关产品推荐
相关产品推荐

