python - PyQt5 QSqlTableModel 不更新对数据库的更改

标签 python mysql pyqt pyqt5 qsqltablemodel

我有一个 PyQt5 应用程序连接到 MySQL 数据库。我制作了连接到同一模型的两个 View 。 View 可以很好地从数据库中提取数据。我对一个领域的任何更改都会反射(reflect)在另一个领域。但它不会更新数据库。我尝试让它闲置 15 分钟,但它没有更新数据库。

这是我的代码:

from PyQt5.QtSql import QSqlDatabase, QSqlQuery, QSqlTableModel
from PyQt5.QtWidgets import QTableView, QApplication
import sys

app = QApplication(sys.argv)

db = QSqlDatabase.addDatabase("QMYSQL")
db.setHostName("localhost")
db.setDatabaseName("usrdb")
db.setUserName("usr")
db.setPassword("passwrd")
db.open()

testModel = QSqlTableModel()
qry = QSqlQuery("select * from test", db)
testModel.setQuery(qry)
testModel.setEditStrategy(QSqlTableModel.OnFieldChange)

testView = QTableView()
testtView.setModel(testModel)
testView2 = QTableView()
testView2.setModel(testModel)

testView.show()
testView2.show()

app.exec_()

我遇到的第二个问题是,一旦我更改一个单元格中的数据, View 就不允许我编辑任何其他单元格中的数据。它们是可选择的,但不可编辑。

最佳答案

解决了我的两个问题。 pyqt 文档建议不要使用 setQuery。

You should normally not call it(setQuery) on a QSqlTableModel. Instead, use setTable(), setSort(), setFilter(), etc., to set up the query.

更新的代码:

from PyQt5.QtSql import QSqlDatabase, QSqlQuery, QSqlTableModel
from PyQt5.QtWidgets import QTableView, QApplication
import sys

app = QApplication(sys.argv)

db = QSqlDatabase.addDatabase("QMYSQL")
db.setHostName("localhost")
db.setDatabaseName("usrdb")
db.setUserName("usr")
db.setPassword("passwrd")
db.open()

testModel = QSqlTableModel()
testModel.setTable("test")
testModel.setEditStrategy(QSqlTableModel.OnFieldChange)
testModel.select()

testView = QTableView()
testtView.setModel(testModel)

app.exec_()

这会在编辑完成后立即更新数据库,并且还允许我对 View 进行多次编辑。

关于python - PyQt5 QSqlTableModel 不更新对数据库的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30246965/

相关文章:

python - 如何从csv文件中随机抽样

python - 在子类中重写 PyQt 信号

python - 在 MySQL 子查询中使用 Python 变量

python - 为什么 PyQt 有时会在退出时崩溃?

python - PyQt4如何恢复最小化的窗口?

python - 列表理解python

python - 获取包含在列表列表中的字典的值

python - 使用从电子邮件中获取链接的功能,如何有效地轮询此功能?

mysql - 如何使用动态生成的链接更新数据库记录

java - 在 JUNIT 中按数据库查询执行组