Как вставить данные из tableWidget в базу данных sqlite - PullRequest
0 голосов
/ 19 февраля 2020

Я пытаюсь вставить данные tableWidget в базу данных SQLite.

1) Общее количество столбцов в строке равно 9, если в таблице содержится менее 9 элементов данных, например: если таблица содержит элементы в date, name, location и item1, он показывает ошибку, подобную этой:

item2 = [self.tableWidget.item (row, 4) .text () для строки в диапазоне (self.tableWidget. rowCount ())] AttributeError: у объекта 'NoneType' нет атрибута 'text'

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

1 Ответ

1 голос
/ 19 февраля 2020

Если элемент пуст, 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
    <b>conn.commit()</b>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...