我正在尝试将tableWidget数据插入SQLite数据库。
1)行中的总列数为9,例如,如果表中的项目数据少于9个,则:如果表中包含日期,名称,位置和item1中的项目,则显示如下错误:
item2 = [self.tableWidget.item(row,4).text()用于范围内的行(self.tableWidget.rowCount())]AttributeError:“ NoneType”对象没有属性“文本”
2)如果表有9个项目,则没有错误,但没有将数据插入数据库。
date = [self.tableWidget.item(row, 0).text() for row in range(self.tableWidget.rowCount())]
name = [self.tableWidget.item(row, 1).text() for row in range(self.tableWidget.rowCount())]
location = [self.tableWidget.item(row, 2).text() for row in range(self.tableWidget.rowCount())]
item1 = [self.tableWidget.item(row, 3).text() for row in range(self.tableWidget.rowCount())]
item2 = [self.tableWidget.item(row, 4).text() for row in range(self.tableWidget.rowCount())]
item3 = [self.tableWidget.item(row, 5).text() for row in range(self.tableWidget.rowCount())]
item4 = [self.tableWidget.item(row, 6).text() for row in range(self.tableWidget.rowCount())]
item5 = [self.tableWidget.item(row, 7).text() for row in range(self.tableWidget.rowCount())]
item6 = [self.tableWidget.item(row, 8).text() for row in range(self.tableWidget.rowCount())]
conn = sqlite3.connect('test.db')
conn.execute("INSERT INTO maintable(date,name,location,item1,item2,item3,item4,item5,item6) \
VALUES ('%s', '%s','%s', '%s', '%s', '%s', '%s', '%s', '%s')" %(''.join(date),
''.join(name),
''.join(location),
''.join(item1),
''.join(item2),
''.join(item3),
''.join(item4),
''.join(item5),
''.join(item6)))
如果项目为空,则item()
将返回None
;您可以检查该项目是否存在于理解范围内:
item2 = [self.tableWidget.item(row, 4).text() for row in range(self.tableWidget.rowCount()) if self.tableWidget.item(row,4)]
# ...
但是这不是很可读,也没有真正优化,因为它将为每行两次调用item()
。我建议使用基于列返回列表的函数:
def getColumn(self, column):
data = []
for row in range(self.tableWidget.rowCount()):
item = self.tableWidget.item(row, column)
if item:
data.append(item.text())
return ''.join(data)
def writeToDatabase(self):
conn = sqlite3.connect('test.db')
conn.execute("INSERT INTO \
maintable(date,name,location,item1,item2,item3,item4,item5,item6) \
VALUES ('{}', '{}','{}', '{}', '{}', '{}', '{}', '{}', '{}') \
".format(*[self.getColumn(c) for c in range(9)]))
# if you don't call commit(), the data is not stored
conn.commit()