Python 将QSqlRelationalTableModel更改提交到数据库
我已经在上修改了关系表模型 我希望能够保存对数据库的更改,但它只保存前两列,而不保存主键查找行。此外,我无法删除这些行。我已经搜索过了,但没有找到任何关于如何做的信息。我做错了什么 我使用的样本数据是:Python 将QSqlRelationalTableModel更改提交到数据库,python,pyqt,pyqt5,qsqltablemodel,qsqlrelationaltablemodel,Python,Pyqt,Pyqt5,Qsqltablemodel,Qsqlrelationaltablemodel,我已经在上修改了关系表模型 我希望能够保存对数据库的更改,但它只保存前两列,而不保存主键查找行。此外,我无法删除这些行。我已经搜索过了,但没有找到任何关于如何做的信息。我做错了什么 我使用的样本数据是: CREATE TABLE `category` ( `Id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, `DrinkType` TEXT NOT NULL); INSERT INTO `category` VALUES (1,'Non-alcoho
CREATE TABLE `category` ( `Id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, `DrinkType` TEXT NOT NULL);
INSERT INTO `category` VALUES (1,'Non-alcoholic');
INSERT INTO `category` VALUES (2,'Alcoholic');
CREATE TABLE "drinks" ( `Id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, `Name` TEXT NOT NULL, `Type` INTEGER );
INSERT INTO `drinks` VALUES (1,'Coca Cola',1);
INSERT INTO `drinks` VALUES (2,'Pilsner',2);
我的代码:
def addRecord():
model.insertRow(model.rowCount())
def delRecord():
model.removeRow(view.currentIndex().row())
model.select()
app = QtWidgets.QApplication(sys.argv)
window = QtWidgets.QWidget()
window.setWindowTitle("QRelationalSqlTableModel")
con = QtSql.QSqlDatabase.addDatabase('QSQLITE')
con.setDatabaseName('drinks.db')
con.open()
model = QtSql.QSqlRelationalTableModel(parent = window)
model.setEditStrategy(QtSql.QSqlTableModel.OnManualSubmit)
model. setTable('drinks')
model.setRelation(2, QtSql.QSqlRelation('category', 'id', 'drinktype'))
model.select()
model.setHeaderData(1, QtCore.Qt.Horizontal, 'Name')
model.setHeaderData(3, QtCore.Qt.Horizontal, 'Type of drink')
vbox = QtWidgets.QVBoxLayout()
view = QtWidgets.QTableView()
view.setModel(model)
view.setItemDelegate(QtSql.QSqlRelationalDelegate(view))
view.hideColumn(0)
view.setColumnWidth(1, 150)
view.setColumnWidth(2, 150)
vbox.addWidget(view)
btnAdd = QtWidgets.QPushButton("&Add record")
btnAdd.clicked.connect(addRecord)
vbox.addWidget(btnAdd)
btnDel = QtWidgets.QPushButton("&Delete record")
btnDel.clicked.connect(delRecord)
vbox.addWidget(btnDel)
window.setLayout(vbox)
window.resize(430, 250)
window.show()
sys.exit(app.exec_())
其中一个问题是因为您使用了不适当的策略,如果使用OnManualSubmit,则必须调用submitAll方法,以便将更改记录在数据库中;如果不想这样做,则最好使用OnRowChange,使用此策略,在添加压力值后将进行更改输入或选择另一行 如果要从数据库中删除行,则必须使用deleteRowFromTable,您使用的是removeRow,但这只会删除视图中的行,而不会删除数据库中的行,因此数据会在一瞬间刷新,显示新的行
def addRecord():
model.insertRow(model.rowCount())
view.scrollToBottom()
def delRecord():
model.deleteRowFromTable(view.currentIndex().row())
model.select()
app = QtWidgets.QApplication(sys.argv)
window = QtWidgets.QWidget()
window.setWindowTitle("QRelationalSqlTableModel")
con = QtSql.QSqlDatabase.addDatabase('QSQLITE')
con.setDatabaseName('drinks.db')
con.open()
model = QtSql.QSqlRelationalTableModel(parent = window)
model.setEditStrategy(QtSql.QSqlTableModel.OnRowChange)
model. setTable('drinks')
model.setRelation(2, QtSql.QSqlRelation('category', 'id', 'drinktype'))
model.select()
model.setHeaderData(1, QtCore.Qt.Horizontal, 'Name')
model.setHeaderData(3, QtCore.Qt.Horizontal, 'Type of drink')
vbox = QtWidgets.QVBoxLayout()
view = QtWidgets.QTableView()
view.setModel(model)
view.setItemDelegate(QtSql.QSqlRelationalDelegate(view))
view.hideColumn(0)
view.setColumnWidth(1, 150)
view.setColumnWidth(2, 150)
vbox.addWidget(view)
btnAdd = QtWidgets.QPushButton("&Add record")
btnAdd.clicked.connect(addRecord)
vbox.addWidget(btnAdd)
btnDel = QtWidgets.QPushButton("&Delete record")
btnDel.clicked.connect(delRecord)
vbox.addWidget(btnDel)
window.setLayout(vbox)
window.resize(430, 250)
window.show()
sys.exit(app.exec_())
愿上帝保佑!非常感谢你。