You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 16:53:11