我正在尝试从我开发的程序中优化方法。
基本上,它是一个显示信息的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。
所以我想知道在模型改变之后是否有办法“重新加载”一个项目,一个索引?
答案 0 :(得分:1)
也许这会有所帮助:
使用:
index = table.model().index(line, 12)
table.model().dataChanged.emit(index,index)
或:
table.model().dataChanged.emit(table.model().index(line, 12),table.model().index(line, 12))
您可以定义受更改影响的项目 见documentation。
按table.model().dataChanged
- 表示table.model.setData()
之后的自动更新或重绘应限于由表示左上角和右下角子项的两个索引定义的区域。如果两个索引相同,则只有一个项目受到影响。
答案 1 :(得分:0)
QSqlTableModel
非常方便但不是魔术。我的猜测是执行update语句需要花费大部分时间。尝试手动更新几行,看看它会持续多长时间。
如果这也很慢,那么你可能需要在表上有一个索引,这样sqlite可以更快地找到行。