1

我有一个 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 文件的工具配对。

4

1 回答 1

1

http://www.qtcentre.org/archive/index.php/t-7565.html

http://www.qtforum.org/article/11245/sqlite-how-to-insert-text-that-c​​ontains-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/

:)

希望有帮助。

于 2013-05-22T06:06:37.853 回答