我有一个到另一张桌子的QSqlRelation的QSqlRelationalTableModel设置,工作得很好。现在,我想在相关表中查找该行的其他列。我该如何做到这一点?
示例表:
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,但我似乎遗漏了什么。
谢谢!
发布于 2016-04-06 19:28:56
当要显示的表中有外键时,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()发布于 2016-04-12 07:45:05
我发现做我想做的事情的最好方法是使用QSqlRelationalTableModel并覆盖selectStatement。
失败的尝试:
使用其他列重载setRelation:
model.setRelation(2, QtSql.QSqlRelation("state", "id", "name, capital"))虽然这会显示数据,但如果您正在使用QSqlRelationalDelegate,它会中断它。
我还尝试添加了一个方法来搜索整个relationModel,但这似乎是一个比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]我也研究了QSqlQueryModel per @pnezis的建议,但它在文档中说
SQLSQL类为
结果集提供只读数据模型...
但它为我指明了正确的方向。谢谢
发布于 2021-11-16 10:46:18
这是一个古老的问题,但我有一个类似的问题和解决方案,这可能是感兴趣的。这适用于Qt版本5.12和Python 3.8 (可能更高版本)。
在QtSql.QSqlRelation()的第三个参数中可以放入多个列名
在您的案例中:
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,您可以将任意放入第三个参数中!
在我的例子中,我需要一个来自另一个查找表的值,因为(为了接近您的数据库布局)大写字母在另一个表中的位置,外键从“state”指向,比方说," capitals“。
示例:
QtSql.QSqlRelation("state", "id", "name, (SELECT capitals.name FROM capitals"
" WHERE capitals.id = relTblAl_1.capital_id) as Capital")如果您想要通过QTableView编辑值,只有一个问题:您可以编辑其他列,但如果您尝试编辑相关列,模型将不知道该做什么。
https://stackoverflow.com/questions/36437055
复制相似问题