【问题标题】:Get values in one or more joined tables using PySide使用 PySide 获取一个或多个连接表中的值
【发布时间】:2017-10-02 18:29:30
【问题描述】:

在处理通过唯一 ID 链接的表时,我试图了解使用 QSqlRelationalTableModel 与 QSqlTableModel 的优势。在以下示例中,组织字段按名称而不是 ID 号正确显示。但是,如何访问链接记录的相应“大小”或“地址”字段?

from PySide.QtCore import *
from PySide.QtGui import *
from PySide.QtSql import *

db = QSqlDatabase.addDatabase("QSQLITE")
db.setDatabaseName("relational_test_01.sqlite")
db.open()
q = QSqlQuery()
q.exec_("CREATE TABLE people(id INTEGER PRIMARY KEY, first VARCHAR(50), last VARCHAR(50), organization INTEGER)")
q.exec_("INSERT INTO people VALUES(1,'John', 'Smith', 1)")
q.exec_("INSERT INTO people VALUES(2,'Bob', 'Jones', 2)")
q.exec_("CREATE TABLE organizations(id INTEGER PRIMARY KEY, name VARCHAR(50),  size INTEGER, address VARCHAR(50))")
q.exec_("INSERT INTO organizations VALUES(1,'Central Gym', 30, '400 Central Street')")
q.exec_("INSERT INTO organizations VALUES(2,'Shoe Store', 5, '200 Central Street')")

db.close()


model = QSqlRelationalTableModel()
model.setTable("people")
model.setRelation(3, QSqlRelation("organizations", "id", "name"))
model.setFilter("people.id = 1")
model.select()
count = model.rowCount()
if count == 1:
    record = model.record(0)
    org = record.value(3)
    print(org)

【问题讨论】:

    标签: python qt foreign-keys pyside qsqltablemodel


    【解决方案1】:

    这里缺少一个功能,已报告为QTBUG-9320。具体来说,没有明显的方法可以从相关表中获取原始外键值。

    幸运的是,有一个未记录的解决方法可以避免该问题。这是通过利用QSqlRelation 的第三个参数来实现的,它实际上能够在结果中指定多于一列。

    以下是如何在您的示例中使用它:

    model = QSqlRelationalTableModel()
    model.setTable("people")
    model.setRelation(3, QSqlRelation("organizations", "id", "name, relTblAl_3.id"))
    model.setFilter("people.id = 1")
    model.select()
    record = model.record(0)
    for i in range(record.count()):
        print((i, record.value(i)))
    org_model = model.relationModel(3)
    org_model.setFilter('organizations.id = %s' % record.value(4))
    org_model.select()
    record = org_model.record(0)
    print()
    for i in range(record.count()):
        print((i, record.value(i)))
    

    输出:

    (0, 1)
    (1, 'John')
    (2, 'Smith')
    (3, 'Central Gym')
    (4, 1)
    
    (0, 1)
    (1, 'Central Gym')
    (2, 30)
    (3, '400 Central Street')
    

    relTblAl_3.id 用于避免名称冲突,并记录在Detailed Description for QSqlRelationalTableModel 末尾的注释中。但是,如果您始终为每列使用唯一名称(例如,使用 org_id 而不是 id 将不需要对表名进行限定),则可以避免这种情况。

    【讨论】:

    • 谢谢。尽管记录了“relTblAl_3”功能,但它感觉晦涩难懂。无论如何,我很高兴它存在。在过去的几周里,你已经回答了我的每一个 PySide 问题。有没有办法就项目直接联系您?
    • @davideps。我很高兴你发现我的回答很有帮助。目前,我恐怕无法参与任何其他项目,因为我已经有其他承诺了。不过,我将始终查看此处发布的任何 pyqt/pyside 相关问题。我不能保证我总是能够回答他们 - 但如果我认为我有一些有用的东西要补充,我至少会发表评论。
    • 我明白了。有才华的人经常很忙 :) 我是 Python 和 Qt 的新手,我正在寻找使用 PySide 或更好的 PySide2 的一般应用指导(咨询)和正式培训。我已经浏览了许多在线可用的教程,但方法似乎是零碎的。 Qt 公司目前似乎没有提供 PySide 培训,并且最近没有关于该主题的书籍。你有什么建议吗?我唯一的选择是自学 Python 并努力阅读 C++ 和旧的 Qt PySide 手册页吗?
    • @davideps。尽管有些过时,Rapid GUI Programming with Python and Qt 可能仍然是最好的单一参考(如果您想在购买前尝试,不难找到要下载的 pdf)。它是为 pyqt4 编写的,但应该至少 95% 与 pyside 兼容。它也使用old-style signal and slot syntax,但不难将其翻译成new-style syntax
    • 感谢您的推荐。也许你应该写下一本关于这个主题的书。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多