我有一个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文件的工具配对。答案 0 :(得分:1)
http://www.qtcentre.org/archive/index.php/t-7565.html
http://www.qtforum.org/article/11245/sqlite-how-to-insert-text-that-contains-character-in-field.html
看起来你需要在将它发送到数据库之前调用下面的一个或两个函数,以便清理输入。
http://qt-project.org/doc/qt-4.8/qsqlquery.html#bindValue
http://qt-project.org/doc/qt-4.8/qsqlquery.html#prepare
:)
希望有所帮助。