如何以优化的方式将数据库中的大量数据插入到 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("=====================")
我有一个按钮,单击它时,它会通过运行函数 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("=====================")