【发布时间】:2015-06-22 14:42:42
【问题描述】:
我正在尝试从我开发的程序中优化一种方法。
基本上,它是一个显示信息的 GUI(我使用 PyQt 库)。信息存储在 sqlite 数据库中。我使用 QSqlTableModel 和 QTableview 来显示这些信息。这是一个很常见的组合。
数据库中的一个字段是一个布尔值,称为“new”。我要优化的方法的目的是将此布尔值设置为 0。
方法如下:
def markOneRead(self, element):
"""Slot to mark an article read"""
print("\n")
print("start markoneread")
start_time = datetime.datetime.now()
# Get the QTableView object (I have several)
table = self.liste_tables_in_tabs[self.onglets.currentIndex()]
# Save the current selected line
line = table.selectionModel().currentIndex().row()
print("before bdd change")
elapsed_time = datetime.datetime.now() - start_time
print(elapsed_time)
# Change the data in the model
# The 12th column is the field "new". I write 0
# !!!!! Very long action
table.model().setData(table.model().index(line, 12), 0)
print("before searchbutton")
elapsed_time = datetime.datetime.now() - start_time
输出是这样的:
before bdd change
0:00:00.000141
before searchbutton
0:00:03.064438
所以基本上,这一行:
table.model().setData(table.model().index(line, 12), 0)
执行需要 3 秒。那很长,我只是在更新数据库中的一个项目,它不应该那么长。我的数据库有 25000 个项目,但我认为它不会改变什么。
编辑: 也许是因为模型立即执行更改,并尝试重新加载所有数据?
你知道如何解决这个问题吗?
编辑 2:
其实问题出在数据的重载上。如果我改变模型的editStrategy:
model.setEditStrategy(QtSql.QSqlTableModel.OnManualSubmit)
现在不再需要 3 秒,但视图没有更新,new 仍然设置为 1,在调用方法之后。
所以我想知道是否有办法在模型更改后“重新加载”一个项目、一个索引?
【问题讨论】:
-
在数据库上执行更新语句更新项目需要多长时间?
标签: python pyqt qtableview qsqltablemodel