[英]Unable to use QtSqlDriver to retrieve data from a table with “.” in column names
我正在尝试使用QtSql.QSqlTableModel读取SQlite数据库。 问题是它不会读取字段名称包含“。”的任何表。 通过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语句是错误的,它将尝试从另一个表“名称”中获取列,但是我想要表“ 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()
。
在“文件保存”方法中,我具有以下内容:
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文件,而我对此无法控制。
http://www.qtcentre.org/archive/index.php/t-7565.html
看起来您只需要在将其发送到数据库之前调用下面的一个或两个函数,即可对输入进行清理。
http://qt-project.org/doc/qt-4.8/qsqlquery.html#bindValue
http://qt-project.org/doc/qt-4.8/qsqlquery.html#prepare
:)
希望能有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.