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

标签 sqlite qt escaping pyqt

我正在尝试使用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文件,而我对此无法控制。

最佳答案

关于sqlite - 无法使用QtSqlDriver从带有“。”的表中检索数据在列名中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16682409/

相关文章:

vb.net - VB.NET SQLite 查询中的 StackOverflow

c++ - cv::Mat到QImage然后返回

python - 如何重新排列 QTableView 的列顺序

c++ - 如何编写QVector fo txt文件

javascript - 在 PHP 中构建 JSON 并在 <script> 中回显时转义字符

每个客户的 SQL 总支出

ios - Monotouch SQLite 每次都会创建一个新数据库吗?

c# - 使用 C# 查询 SQlite 数据库时出现 ConstraintException

javascript - 如何像 String() 那样遵循转义序列

java - 有没有一种方法可以在Java字符串中引用大括号?