无法使用QtSqlDriver从带有“。”的表中检索数据。在列名称中

时间:2013-05-22 02:13:59

标签: sqlite qt escaping pyqt

我有一个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”中获取列,但我想在表“MyTable”中找到一个名为“Name.First”的列

我试图通过继承setTable方法来解决这个问题,该方法用于将数据导入TableView:

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": syntax error Unable to execute statement
ERROR:root:Error SELECT * FROM MyTable

但是当我不重新实现setTable方法时,submitAll()无误地运行。

所以...我如何规避“。”在列名称问题,还有submitAll()工作吗?

顺便说一句:我同意拥有“。”在SQL表的字段名称中不是一个好主意,但这与另一个以我无法控制的方式生成sqlite文件的工具配对。

相关问题