#python #qtableview #qsqltablemodel #pyside6
Вопрос:
Я пытаюсь вставить строку в базу данных PostgreSQL, используя QSqlRelationalTableModel. Соединение работает, и я могу редактировать данные в виде таблицы. Однако я застрял в попытке вставить новую строку. Ошибка вызвана нулевыми значениями для полей связи. Кажется, я не могу просто подтолкнуть к ним целые числа. Итак, как правильно это сделать, если вы не можете найти ответ на этот вопрос?
class Accounts(QDialog):
def __init__(self, parent=None):
super().__init__(parent)
# Set up the ui
self.ui = Ui_account()
self.ui.setupUi(self)
self.ui.addbutton.clicked.connect(self.onadd)
self.ui.closebutton.clicked.connect(self.onclose)
self.userid = parent.userid
# Set up the model
self.model = QSqlRelationalTableModel(self)
self.model.setTable("accounts")
self.model.setEditStrategy(QSqlRelationalTableModel.OnRowChange)
self.model.setHeaderData(0, Qt.Horizontal, "id")
self.model.setHeaderData(1, Qt.Horizontal, "name")
self.model.setHeaderData(2, Qt.Horizontal, "currencyid")
self.model.setHeaderData(3, Qt.Horizontal, "created")
self.model.setHeaderData(4, Qt.Horizontal, "createdby")
self.model.setHeaderData(5, Qt.Horizontal, "closed")
self.model.setRelation(2,QSqlRelation("currency","id","type"))
self.model.setRelation(4,QSqlRelation("employees","id","name"))
self.model.select()
# Set up the view
self.ui.accountview.setModel(self.model)
self.ui.accountview.setColumnHidden(0,True)
self.ui.accountview.horizontalHeader().setSectionResizeMode(1, QHeaderView.Stretch)
self.ui.accountview.horizontalHeader().setSectionResizeMode(2, QHeaderView.ResizeToContents)
self.ui.accountview.horizontalHeader().setSectionResizeMode(3, QHeaderView.ResizeToContents)
self.ui.accountview.horizontalHeader().setSectionResizeMode(4, QHeaderView.ResizeToContents)
self.ui.accountview.horizontalHeader().setSectionResizeMode(5, QHeaderView.ResizeToContents)
self.ui.accountview.setItemDelegate(QSqlRelationalDelegate(self.ui.accountview))
def onadd(self):
# Insert a new record
r = self.model.record()
# Auto generated in the PSQL database
r.setGenerated("id",False)
r.setGenerated("created",False)
r.setGenerated("closed",False)
r.setValue("name",self.ui.accname.text())
# Stored in db as integers of the primary key of the other tables
r.setValue("currencyid",self.ui.currency.currentIndex())
r.setValue("createdby",self.userid)
self.model.insertRecord(-1,r)
# Fails at this point with NULL values for the foreign keys
self.model.select()`
Ответ №1:
Наконец-то нашел старый комментарий с 2014 года при поиске только на QT, а не конкретно на PyQt. Похоже, проблема возникает только для полей отношений. Исправление состоит в том, чтобы называть его не по имени, а только по индексу. Поэтому приведенные выше 2 строки следует изменить на:
r.setValue(2,self.ui.currency.currentIndex())
r.setValue(4,self.userid)
И теперь все работает.