首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QSqlRelationalTableModel其他相关列

QSqlRelationalTableModel其他相关列
EN

Stack Overflow用户
提问于 2016-04-06 05:06:37
回答 3查看 781关注 0票数 1

我有一个到另一张桌子的QSqlRelationQSqlRelationalTableModel设置,工作得很好。现在,我想在相关表中查找该行的其他列。我该如何做到这一点?

示例表:

代码语言:javascript
复制
city ('id', 'name', 'state_id')
state ('id', 'name', 'capital')

到目前为止,我所拥有的:

代码语言:javascript
复制
model = QtSql.QSqlRelationalTableModel()
model.setTable('city')
model.setRelation(2, QtSql.QSqlRelation("state", "id", "name"))
model.select()

这会给我一个类似这样的行:

代码语言:javascript
复制
| 1 | 'San Francisco' | 'California' |

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

谢谢!

EN

回答 3

Stack Overflow用户

发布于 2016-04-06 19:28:56

当要显示的表中有外键时,QSqlRelationalTableModel非常有用。在本例中,capital不是city表中的一列。

相反,您应该使用QSqlQueryModelJOIN这两个表,以便获得您想要的列。像这样的东西应该是可行的

代码语言:javascript
复制
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()
票数 2
EN

Stack Overflow用户

发布于 2016-04-12 07:45:05

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

失败的尝试:

使用其他列重载setRelation:

代码语言:javascript
复制
model.setRelation(2, QtSql.QSqlRelation("state", "id", "name, capital"))

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

我还尝试添加了一个方法来搜索整个relationModel,但这似乎是一个比selectStatement()方法更糟糕的解决方案。

代码语言:javascript
复制
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类为

结果集提供只读数据模型...

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

票数 1
EN

Stack Overflow用户

发布于 2021-11-16 10:46:18

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

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

在您的案例中:

代码语言:javascript
复制
QtSql.QSqlRelation("state", "id", "name, capital")

  • 在内部,外部表将获得一个指定的名称,如relTblAl_n,因此,如果列名不明确,则可以将其用作前缀

示例:

代码语言:javascript
复制
QtSql.QSqlRelation("state", "id", "name, relTblAl_1.capital")

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

示例:

代码语言:javascript
复制
QtSql.QSqlRelation("state", "id", "name || ' Capital: ' || relTblAl_1.capital AS state_information")

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

在我的例子中,我需要一个来自另一个查找表的值,因为(为了接近您的数据库布局)大写字母在另一个表中的位置,外键从“state”指向,比方说," capitals“。

示例:

代码语言:javascript
复制
QtSql.QSqlRelation("state", "id", "name, (SELECT capitals.name FROM capitals"
                  " WHERE capitals.id = relTblAl_1.capital_id) as Capital")

如果您想要通过QTableView编辑值,只有一个问题:您可以编辑其他列,但如果您尝试编辑相关列,模型将不知道该做什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36437055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档