Python3与SQLite3:如何仅向表中指定4列插入数据
解决SQLite3插入指定列的问题
这个报错的原因很直白——你的INSERT语句没明确指定要插入的列名,SQLite默认会认为你要给表中全部6列赋值,但你只提供了4个值,自然就出现列数不匹配的冲突了。
要实现仅向指定4列插入数据,只需要在INSERT INTO后面补上你要插入的列名列表就行,具体写法如下:
单条数据插入
# 把col1/col2/col3/col4替换成你实际要插入的真实列名,顺序要和元组里的值对应 cursor.execute("INSERT INTO blacklisted_ips (col1, col2, col3, col4) VALUES (?, ?, ?, ?)", list_name[0])
批量数据插入(更适合你的场景)
因为你的list_name是包含多个数据元组的列表,用executemany会比循环执行execute更高效:
# 同样先指定目标列名 cursor.executemany("INSERT INTO blacklisted_ips (col1, col2, col3, col4) VALUES (?, ?, ?, ?)", list_name)
关键注意点
- 一定要把示例里的
col1, col2, col3, col4替换成你表中真实的列名,而且列的顺序必须和你元组中值的顺序完全对应; - 剩下的2列如果在表定义时允许为空(设置了
NULL约束),SQLite会自动给它们赋NULL值;如果这两列有默认值,就会使用预设的默认值;但如果是必填且无默认值的列,那你还是得补充对应的值才行。
举个贴合你数据的实际例子,假设你要插入的4列是id, tag, record_date, create_time,完整代码会是这样:
import sqlite3 # 连接数据库 conn = sqlite3.connect('your_db_file.db') cursor = conn.cursor() list_name = [(24, 'somestring', '2018/05/06', '2018-05-13 10:16:34'), (24, 'somestring', '2018/05/06', '2018-05-13 10:16:34')] # 明确指定要插入的列名,执行批量插入 cursor.executemany("INSERT INTO blacklisted_ips (id, tag, record_date, create_time) VALUES (?, ?, ?, ?)", list_name) # 提交更改并关闭连接 conn.commit() conn.close()
这样就能精准把数据插入到你指定的4列中,不会再出现列数不匹配的报错了。
内容的提问来源于stack exchange,提问作者user2980822
相关产品推荐
相关产品推荐

