如何将tableWidget中的数据插入sqlite数据库中

问题描述 投票:0回答:1

我正在尝试将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)))

qTableWidget

python-3.x pyqt5
1个回答
0
投票

如果项目为空,则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()
© www.soinside.com 2019 - 2024. All rights reserved.