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,从而节省我们帮助您的时间,而不必消除愚蠢的代码。
您需要帮助: 奥秘位于方法 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,从而节省我们帮助您的时间,而不必消除愚蠢的代码。