QTableWidget数据插入SQLite数据库:报错及数据未插入问题排查
搞定QTableWidget数据插入SQLite的两个问题
嘿,这俩问题我之前也踩过坑,咱们一步步来解决:
问题1:空列触发的AttributeError
当表格里某一行的某一列没有数据时,self.tableWidget.item(row, col)会返回None,这时候直接调用.text()肯定会报错。解决办法很简单:先判断这个item是否存在,不存在就用空字符串代替就行。
把你原来的列表推导式改成这样:
date = [self.tableWidget.item(row, 0).text() if self.tableWidget.item(row, 0) else '' for row in range(self.tableWidget.rowCount())] name = [self.tableWidget.item(row, 1).text() if self.tableWidget.item(row, 1) else '' for row in range(self.tableWidget.rowCount())] location = [self.tableWidget.item(row, 2).text() if self.tableWidget.item(row, 2) else '' for row in range(self.tableWidget.rowCount())] item1 = [self.tableWidget.item(row, 3).text() if self.tableWidget.item(row, 3) else '' for row in range(self.tableWidget.rowCount())] item2 = [self.tableWidget.item(row, 4).text() if self.tableWidget.item(row, 4) else '' for row in range(self.tableWidget.rowCount())] item3 = [self.tableWidget.item(row, 5).text() if self.tableWidget.item(row, 5) else '' for row in range(self.tableWidget.rowCount())] item4 = [self.tableWidget.item(row, 6).text() if self.tableWidget.item(row, 6) else '' for row in range(self.tableWidget.rowCount())] item5 = [self.tableWidget.item(row, 7).text() if self.tableWidget.item(row, 7) else '' for row in range(self.tableWidget.rowCount())] item6 = [self.tableWidget.item(row, 8).text() if self.tableWidget.item(row, 8) else '' for row in range(self.tableWidget.rowCount())]
这样不管哪列是空的,都会用空字符串填充,再也不会触发NoneType的错误了。
问题2:数据没插入数据库的坑
你的插入逻辑有三个关键问题:
- 把整列数据拼成了一个字符串:比如
''.join(date)会把所有行的日期连在一起,最后只插入一条记录,这完全不是你要的效果——应该是每行对应数据库的一条记录。 - 忘了提交事务:SQLite默认不会自动提交,你必须手动调用
conn.commit(),不然数据只会在内存里,不会写到数据库文件里。 - 字符串拼接SQL不安全:直接用
%s拼字符串容易触发SQL注入,而且格式出错概率高,用参数化查询才是正确姿势。
给你改好的插入代码:
import sqlite3 # 先拿到表格的总行数 row_count = self.tableWidget.rowCount() # 连接数据库 conn = sqlite3.connect('test.db') cursor = conn.cursor() # 遍历每一行,插入对应数据 for row in range(row_count): # 逐行获取数据,同时处理空值 current_date = self.tableWidget.item(row, 0).text() if self.tableWidget.item(row, 0) else '' current_name = self.tableWidget.item(row, 1).text() if self.tableWidget.item(row, 1) else '' current_location = self.tableWidget.item(row, 2).text() if self.tableWidget.item(row, 2) else '' current_item1 = self.tableWidget.item(row, 3).text() if self.tableWidget.item(row, 3) else '' current_item2 = self.tableWidget.item(row, 4).text() if self.tableWidget.item(row, 4) else '' current_item3 = self.tableWidget.item(row, 5).text() if self.tableWidget.item(row, 5) else '' current_item4 = self.tableWidget.item(row, 6).text() if self.tableWidget.item(row, 6) else '' current_item5 = self.tableWidget.item(row, 7).text() if self.tableWidget.item(row, 7) else '' current_item6 = self.tableWidget.item(row, 8).text() if self.tableWidget.item(row, 8) else '' # 参数化查询,安全又可靠 cursor.execute(""" INSERT INTO maintable(date, name, location, item1, item2, item3, item4, item5, item6) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) """, (current_date, current_name, current_location, current_item1, current_item2, current_item3, current_item4, current_item5, current_item6)) # 一定要提交事务!这步不能忘 conn.commit() # 最后关闭连接 conn.close()
这样改完,每行数据都会正确插入到数据库,空列的问题也顺带处理了。
内容的提问来源于stack exchange,提问作者user3030327
相关产品推荐
相关产品推荐

