QSqlRelationalTableModel 附加相关列

问题描述 投票:0回答:4

我有一个

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 并将其替换为映射列,但我不想更改状态表。我已经研究过
QSqlRecord
QSqlRelation
,但我似乎遗漏了一些东西。

谢谢!

python qt sqlite pyqt pyside
4个回答
3
投票
当您要显示的表中有外键时,

QSqlRelationalTableModel
非常有用。在您的情况下,
capital
不是
city
表的列。

您应该使用

QSqlQueryModel
JOIN
这两个表来获取您想要的列。像这样的东西应该有效

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()

1
投票

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

失败的尝试:

使用附加列重载 setRelation:

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

虽然这显示了数据,但如果您使用的是 QSqlRelationalDelegate,它会破坏 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 结果集提供只读数据模型...

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


0
投票

这是一个老问题,但我有一个类似的问题和解决方案,可能会感兴趣。 这适用于 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 编辑值,只有一个问题:你可以编辑其他列,但如果你尝试编辑相关列,模型不知道该怎么做。


0
投票

阅读上面的答案,但只是为了尝试一下:

self.model.setRelation( ix_foreign_key,
  QSqlRelation( foreign_table, foreign_table_key, "name, photo_fn"  ))

是的,在我看来,我去了两个外国专栏。 到目前为止一切都很好,但是 我应该多测试一下。 尝试一下。

© www.soinside.com 2019 - 2024. All rights reserved.