QSqlTableModel.setData 错误但 lastError() 始终为空

QSqlTableModel.setData error but lastError() always empty

您需要帮助: 奥秘位于方法 setupNumRibs.

在我的测试设置中,table 只包含一行。

res = self.setData(self.index(0, 1), numRows )

按预期执行并执行 table 更新。

res = self.setData(self.index(1, 1), numRows )

必须失败,因为要更新的行不存在。 res 如预期的那样是 FALS,但是在我得到的 cmd 行上:

model ErrT : 0
model Err text : ||

db ErrT : 0
db Err text : ||

怎么会

modelError = self.lastError()

失败,我没有得到正确的信息,但我不明白为什么 :-(

完整代码:

from Singleton.Singleton import Singleton

class ProcessorModel(QSqlTableModel, metaclass=Singleton):

def __init__(self, parent=None):
    self.fileNamePath = ''
    self.fileVersion = ''
    
    # open database
    self.db = QSqlDatabase.addDatabase("QSQLITE")
    self.db.setDatabaseName("processorModel.sqlite")
    if not self.db.open():
        logging.error(self.__className+ '.__init__ cannot open db')
    
    super().__init__()
    # make sure tables are there
    self.rib_M = self.RibModel()
    self.wing_M = self.WingModel()
    
def isValid( self, fileName ):

def setFileName( self, fileName ):

def openFile(self):

def readFile(self):
   
def remTabSpace(self, line):

def remTabSpaceQuot(self, line):

class WingModel(QSqlTableModel, metaclass=Singleton):
    

    def createWingTable(self):    

    def __init__(self, parent=None):
         
    def syncData(self, q):

class RibModel(QSqlTableModel, metaclass=Singleton):
    
    __className = 'RibModel'
    
    RibNumCol = 1
    xribCol = 2
    yLECol = 3
    yTECol = 4
    xpCol = 5
    zCol = 6
    betaCol = 7
    RPCol = 8
    WashinCol = 9

    def createRibTable(self): 
        logging.debug(self.__className+'.createRibTable')   
        query = QSqlQuery()
            
        query.exec("DROP TABLE if exists Rib;")
        query.exec("create table if not exists Rib ("
                "ID INT PRIMARY KEY,"
                "RibNum varchar(50),"
                "xrib varchar(50),"
                "yLE varchar(50),"
                "yTE varchar(50),"
                "xp varchar(50),"
                "z varchar(50),"
                "beta varchar(50),"
                "RP varchar(50),"
                "Washin varchar(50));")
        query.exec("INSERT into Rib (ID) Values( '1' );")
        
    def __init__(self, parent=None):
        '''
        :method: Constructor
        '''
        super().__init__()
        self.createRibTable()
        self.setTable("Rib")
        self.select()
        self.setEditStrategy(QSqlTableModel.OnFieldChange)
        
    def setupNumRibs(self, halfNumRibs):
        logging.debug(self.__className+'.setupNumRibs')
        numRows = self.rowCount()
        
        res = self.setData(self.index(1, 1), numRows )
        if not res:
            modelError = self.lastError()
            print('model ErrT : %s' %modelError.type())
            print('model Err text : |%s|' %modelError.text())
            print()
            procM = ProcessorModel()
            dbError = procM.db.lastError()
            print('db ErrT : %s' %dbError.type())
            print('db Err text : |%s|' %dbError.text())
            print()

看完就没有玄机了the docs:

QSqlError QSqlQueryModel::lastError() const

Returns information about the last error that occurred on the database.

明确指出 lastError() 表示与数据库交互时发生的错误,但在您的情况下它不会交互,因为模型首先验证 QModelIndex 是否有效,然后您的无效它 returns 在不与数据库进行任何事务的情况下立即为假。

另一方面,不要通过添加单例或其他只是噪音的元素来使您的问题复杂化。建议您为每个问题创建一个仅关注问题的 MRE,从而节省我们帮助您的时间,而不必消除愚蠢的代码。