我正在尝试使用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:靠近“ SET”的错误:语法错误无法执行语句
ERROR:root:Error SELECT * FROM MyTable
但是,当我不重新实现
setTable
方法时,submitAll()
可以正常工作。所以...我该如何规避“。”在列名称问题,也有submitAll()工作?
顺便说一句:我同意拥有“。”在SQL表的字段名中输入一个好主意不是一个好主意,但这是与另一个工具结合使用的,该工具以这种方式生成sqlite文件,而我对此无法控制。
最佳答案
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
http://xkcd.com/327/
:)
希望有帮助。
关于sqlite - 无法使用QtSqlDriver从带有“。”的表中检索数据在列名中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16682409/