我有一个
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
,但我似乎遗漏了一些东西。
谢谢!
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()
我发现做我想做的事情的最好方法是使用 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 结果集提供只读数据模型...
但它为我指明了正确的方向。谢谢
这是一个老问题,但我有一个类似的问题和解决方案,可能会感兴趣。 这适用于 Qt 版本 5.12 和 Python 3.8(可能还有更新版本)。
您的情况:
QtSql.QSqlRelation("state", "id", "name, capital")
示例:
QtSql.QSqlRelation("state", "id", "name, relTblAl_1.capital")
示例:
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 编辑值,只有一个问题:你可以编辑其他列,但如果你尝试编辑相关列,模型不知道该怎么做。
阅读上面的答案,但只是为了尝试一下:
self.model.setRelation( ix_foreign_key,
QSqlRelation( foreign_table, foreign_table_key, "name, photo_fn" ))
是的,在我看来,我去了两个外国专栏。 到目前为止一切都很好,但是 我应该多测试一下。 尝试一下。