簡體   English   中英

QSqlTableModel.insertRecord(row, record) 不在指定行插入

[英]QSqlTableModel.insertRecord(row, record) not inserting at specified row

使用此處提供的答案,我能夠將記錄插入到我的 QSqlTableModel 中。 雖然這會將記錄附加到末尾(行 = -1)就好了,但更改行不會更改插入記錄的位置。 如何在指定行插入記錄?

import sys
from PySide6.QtWidgets import (QApplication, QMainWindow, QTableView)
from PySide6.QtSql import QSqlDatabase, QSqlTableModel, QSqlQuery


class SQLTableModel(QSqlTableModel):
    def __init__(self, parent=None):
        super().__init__(parent)
        query = QSqlQuery()
        query.exec(
            "CREATE TABLE table1"
            "(id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL, "
            "type TEXT)"
        )


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.db = QSqlDatabase.addDatabase("QSQLITE")
        self.db.setDatabaseName("SQLTableDatabase.sqlite")
        self.db.open()

        self.table_view = QTableView()
        self.model = SQLTableModel()
        self.table_view.setModel(self.model)
        self.model.setTable("table1")

        for i in range(4):
            record = self.model.record()
            record.setValue("type", str(i))
            self.model.insertRecord(-1, record)

        record = self.model.record()
        record.setValue("type", "TEST")
        self.model.insertRecord(2, record)  # Why is this record not inserted at row 2?
        self.model.select()

        self.setCentralWidget(self.table_view)


app = QApplication(sys.argv)
mainwindow = MainWindow()
mainwindow.show()
sys.exit(app.exec())

由於它們的性質,數據庫沒有在給定索引處插入的概念:記錄總是附加的。

默認的editStrategy (指示模型何時將更改實際提交到數據庫)是OnRowChange ,並且每當插入新記錄時也會發生這種情況。

結果是當你到達for循環的末尾時,模型已經提交了更改並且新記錄已經插入,所以無論你使用什么row ,數據庫都只能在末尾插入新記錄。

在給定行中插入記錄的唯一(簡單)方法是在先前已插入但尚未提交的情況下執行此操作,並使用OnManualSubmit策略。

在你的情況下:

class MainWindow(QMainWindow):
    def __init__(self):
        # ...
        self.model = SQLTableModel()
        self.model.setTable("table1")
        self.model.setEditStrategy(self.model.OnManualSubmit)

        # ...

        self.model.insertRecord(2, record)
        self.model.submitAll()
        self.model.select()
        self.model.setEditStrategy(self.model.OnRowChange)

這將在第 2 行正確插入最后一條記錄。

但是,如果以前的記錄已經存在於數據庫中(或以前提交過),那么您無能為力,除了重新生成表,或手動UPDATE從所需行開始的所有記錄,通過“移動”每個記錄的現有數據記錄到下一行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM