【问题标题】:QSqlRelationalTableModel additional related columnsQSqlRelationalTableModel 附加相关列
【发布时间】:2016-07-26 00:36:28
【问题描述】:

我有一个 QSqlRelationalTableModel 设置和一个 QSqlRelation 到另一个工作得很好。现在,我想在相关表上查找该行的其他列。我该如何做到这一点?

示例表:

city ('id', 'name', 'state_id')
state ('id', 'name', 'capital')

到目前为止我所拥有的:

model = QtSql.QSqlRelationalTableModel()
model.setTable('city')
model.setRelation(2, QtSql.QSqlRelation("state", "id", "name"))
model.select()

这会给我这样的一行:

| 1 | 'San Francisco' | 'California' |

现在我想从城市表中查找州模型中的首都。我该怎么做呢?我对setRelation 的理解是它从 X 列的 main_table 中获取 id 并将其替换为映射列,但我不想更改状态表。我查看了QSqlRecordQSqlRelation,但我似乎遗漏了一些东西。

谢谢!

【问题讨论】:

    标签: python qt sqlite pyqt pyside


    【解决方案1】:

    QSqlRelationalTableModel 在要显示的表中有外键时很有用。在您的情况下,capital 不是city 表的列。

    您应该使用QSqlQueryModelJOIN 这两个表来获取您想要的列。像这样的东西应该可以工作

    model = QtSql.QSqlQueryModel()
    model.setQuery("SELECT city.id, city.name, state.name, state.capital FROM city "
                    "INNER JOIN state ON city.state_id = state.id");
    model.select()
    

    【讨论】:

    • 我担心会是这样。不幸的是,这对我不起作用,因为 QSqlQueryModel 是只读的,而我的应用程序用于可编辑模型(但不是大写)。是否可以覆盖查询以使 QSqlRelationalTableModel 的 setRelation 部分仍然像当前一样工作?
    【解决方案2】:

    我发现做我想做的事情的最佳方法是使用 QSqlRelationalTableModel 并覆盖 selectStatement。

    尝试失败:

    用附加列重载 setRelation:

    model.setRelation(2, QtSql.QSqlRelation("state", "id", "name, capital"))
    

    虽然这会显示数据,但如果您使用的是 QSqlRelationalDelegate,它会中断。

    我还尝试添加一种方法来搜索关系模型,但这似乎比 selectStatement() 方法更糟糕。

    def getStateForRow(self, row):
        # The state is col 2
        stateModel=self.relationModel(2)
        return stateModel.match(stateModel.index(0,1), QtCore.Qt.DisplayRole, self.record(row).value(2), flags = QtCore.Qt.MatchExactly)[0]
    

    我还根据@pnezis 的建议研究了 QSqlQueryModel,但它在文档中说

    QSqlQueryModel 类为 SQL 结果集提供只读数据模型...

    但它为我指明了正确的方向。谢谢

    【讨论】:

      【解决方案3】:

      这是一个老问题,但我有一个类似的问题和一个解决方案,这可能很有趣。 这适用于 Qt 版本 5.12 和 Python 3.8(可能还有更新的版本)。

      • QtSql.QSqlRelation()的第三个参数可以放多个列名

      在你的情况下:

      QtSql.QSqlRelation("state", "id", "name, capital")
      
      • 在内部,外部表获得一个分配的名称,如 relTblAl_n,因此如果列名不明确,可以使用它作为前缀

      例子:

      QtSql.QSqlRelation("state", "id", "name, relTblAl_1.capital")
      
      • 您还可以指定别名,或连接列和任意文本(尽管这可能不可移植,“||”适用于 SQLite 和 Oracle)

      例子:

      QtSql.QSqlRelation("state", "id", "name || ' Capital: ' || relTblAl_1.capital AS state_information")
      

      现在最好的部分是:您可以将任意 SQL 放入第三个参数!

      在我的情况下,我需要另一个查找表中的值,因为(为了接近您的数据库布局)在另一个表中的大写字母,外键从“状态”指向,比如说,“大写字母”。

      例子:

      QtSql.QSqlRelation("state", "id", "name, (SELECT capitals.name FROM capitals"
                        " WHERE capitals.id = relTblAl_1.capital_id) as Capital")
      

      如果你想通过QTableView编辑值,只有一个问题:你可以编辑其他列,但是如果你试图编辑相关列,模型不知道该怎么做。

      【讨论】:

        猜你喜欢
        • 2022-01-05
        • 1970-01-01
        • 2018-12-16
        • 1970-01-01
        • 2021-07-21
        • 1970-01-01
        • 2015-07-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多