QSqlTableModel.setData错误,但lastError()总是空的



需要你的帮助:

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

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

按预期执行并更新表。

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

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

model ErrT : 0
model Err text : ||
db ErrT : 0
db Err text : ||

Somwhow

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()

单例类可以在这里找到

如果你阅读文档,就会发现这并不神秘:

QSqlError QSqlQueryModel::lastError() const

返回有关最后一次错误的信息数据库。

很明显,lastError()表示与数据库交互时发生的错误,但在您的情况下,它不会交互,因为模型首先验证QModelIndex是有效的,并且由于您的QModelIndex无效,因此它立即返回false,而不与数据库进行任何事务。

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

最新更新