如何以优化的方式将数据库中的大量数据插入到 TableWidget 中?

How can i insert a massive amount of data From a DataBase into a TableWidget in a optimized way?

我有一个按钮,单击它时,它会通过运行函数 add_values 将数据库的数据显示到 TableWidget,如果你有几千行,它也能正常工作,但假设你有数百万行,这是非常低效的,因为我正在使用方法 feachall() 将数据库的数据附加到变量中,并使用 for 循环将数据插入 TableWidget。

这是我的代码。

DataBase = sqlite3.connect("DataBase.db",check_same_thread=False)
cursor = DataBase.cursor()

class TableWidget(QTableWidget):
    def __init__(self):
        super().__init__(1, 5)

        self.setHorizontalHeaderLabels(list('ABCDE'))


class AppDemo(QWidget):
    def __init__(self):
        super().__init__()
        self.resize(600, 600)

        self.mainLayout = QVBoxLayout()
        self.table = TableWidget()
        self.button = QPushButton("add items")
        self.button.clicked.connect(self.add_values)
        self.mainLayout.addWidget(self.table)
        self.mainLayout.addWidget(self.button)
        self.setLayout(self.mainLayout)


    def add_values(self):
        
        cursor.execute("select * from Peaple")

        data = cursor.fetchall()

        self.table.setRowCount(len(data))
        self.table.setColumnCount(5)

        for i in range(0, len(data)):
            for j in range(0,5):
                self.table.setItem(i,j , QtWidgets.QTableWidgetItem(str(data[i][j])))



app = QApplication(sys.argv)
demo = AppDemo()
demo.show()
app.exit(app.exec_())

我查看了 DB Browser SQLite 以了解当您浏览数据时它是如何处理这个问题的,而 DB Browser SQLite 仅在您实际看到数据时才加载数据,而不是 'Pre-loads' 预先加载的所有内容。

Illustrating what i mean

有没有办法在 pyqt 中做这样的事情,或者有其他解决方案吗?

注意,我不能使用线程,因为即使如此,将数据库的数据附加到变量中也需要一些时间。

你想要这个吗?

    #get cursor on app start
        cursor.execute("select * from Peaple")

    def add_values(self):        
        
        needed = 2
        data = cursor.fetchmany(needed)

        column = 5
        self.table.setColumnCount(column)

        rowCount = self.table.rowCount()

        try:
            for i in range(0, needed):
                for j in range(0, column):
                    self.table.setItem(rowCount-1+i, j, QTableWidgetItem(str(data[i][j])))
                self.table.setRowCount(rowCount+i+1)

        except IndexError:
            print("=====================")
            print("IndexError Because There is No Data to Get From Table")
            print("=====================")