我有一个 SQlite 数据库,我正在尝试使用 QtSql.QSqlTableModel 读取。问题是它不会读取任何字段名称包含“。”的表。通过 setTable 方法。
例如,如果我有名为 MyTable 的表,其列名(ID、Name.First、Name.Last),我可以使用查询手动选择它
SELECT * FROM MyTable
或者
SELECT "ID", "Name.First", "Name.Last" and all is ok
但是,QSqlTableModel 不会使用该查询,但会出现“没有这样的列 Name.First 无法执行语句”的错误。
当我深入挖掘时,Qt 中的 SQLITE 驱动程序会将查询重写为
SELECT "ID", "Name"."First", "Name"."Last" FROM MyTable
但是这个 SELECT 语句是错误的,它会尝试从另一个表“Name”中获取列,但我想要一个名为“Name.First”的列在表“MyTable”中
我试图通过子类化用于将数据放入 TableView 的 setTable 方法来规避这个问题:
def tableName(self):
return self._tableName
def setTable(self, tableName):
self.clear()
self._tableName = tableName
self.setQuery(QtSql.QSqlQuery("SELECT * FROM {0}".format(tableName), self.database()))
但是,以这种方式重新实现该方法破坏了该方法submitAll()
。
在 File Save 方法中,我有以下内容:
ok = self.tableModel.submitAll()
if not ok:
logging.error('Error %s' % self.tableModel.lastError().text())
logging.error('Error %s' % self.tableModel.query().lastQuery())
return False
这给出了这个日志:
ERROR:root:Error near "SET": 语法错误无法执行语句 ERROR:root:Error SELECT * FROM MyTable
但是当我不重新实现该setTable
方法时,submitAll()
可以正常工作。
所以......我该如何规避“。” 在列名问题中并且也有 submitAll() 工作?
顺便说一句:我同意有“。” 在 SQL 表的字段名称中不是一个好主意,但这是与另一个以我无法控制的方式生成 sqlite 文件的工具配对。