【问题标题】:QSqlRelationalTableModel only populates first 256 recordsQSqlRelationalTableModel 仅填充前 256 条记录
【发布时间】:2017-07-06 06:38:09
【问题描述】:

我有以下使用 PyQt5、sqlite3 和 python3.5.2 的简单模型。

class choicesModel(QDialog):
    def __init__(self, parent=None):
        super(choicesModel, self).__init__()

        query = QSqlQuery()
        query.prepare("SELECT COUNT(*) FROM resident_choices")
        query.exec_()
        query.next()
        dbrows = query.value(0)
        print("rows in db: ", dbrows)

        self.choicesModel = QSqlRelationalTableModel(self)
        self.choicesModel.setEditStrategy(QSqlTableModel.OnManualSubmit)
        self.choicesModel.setTable("resident_choices")
        self.choicesModel.select()
        rows = self.choicesModel.rowCount()
        print("rows returned by model.select(): ", rows)

执行模型会产生以下输出:

数据库中的行数:831

model.select() 之后的行数:256

最初的选择似乎只填充了前 256 条记录。这是一个 sqlite3 问题吗?如果是,我该如何填充所有记录(数据库总共只有大约 850 条记录)。如果不是,我如何强制加载所有记录?

结果是使用代理模型和代理视图最初不会显示所有记录,直到我更改代理过滤条件 - 也就是说,我必须触发其余记录的加载。

【问题讨论】:

    标签: python sqlite pyqt qsqlquery qsqltablemodel


    【解决方案1】:

    记录数在QSqlQueryModel 类中硬编码为#define QSQL_PREFETCH 255。要覆盖它,您必须自己显式获取所有行:

    while self.choicesModel.canFetchMore():
        self.choicesModel.fetchMore()
    

    您可能需要在每次更新模型时运行这样的代码,因此最好创建自己的子类并重新实现fetchMore

    【讨论】:

    • 非常感谢您的快速回复。
    猜你喜欢
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 2021-05-10
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    相关资源
    最近更新 更多