2017-10-02 15 views
1

고유 ID를 통해 연결된 테이블을 처리 할 때 QSqlRelationalTableModel 대 QSqlTableModel을 사용하는 이점을 이해하려고합니다. 다음 예에서 조직 필드는 ID 번호 대신 이름으로 올바르게 표시됩니다. 그러나 연결된 레코드의 해당 "크기"또는 "주소"필드에 어떻게 액세스합니까?PySide를 사용하여 하나 이상의 조인 된 테이블에서 값 가져 오기

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) 

답변

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 끝. 그러나 모든 열에 항상 고유 한 이름을 사용하는 경우 (예 : id 대신 org_id을 사용하면 테이블 이름에 대한 자격이 필요하지 않음)이 문제를 피할 수 있습니다.

+0

감사합니다. "relTblAl_3"기능이 문서화되어 있지만, 불분명합니다. 어쨌든, 나는 그것이 존재하게되어 기쁩니다. 지난 몇 주간 PySide 질문에 모두 대답했습니다. 프로젝트와 관련하여 직접 연락 할 수있는 방법이 있습니까? – davideps

+0

@davideps. 내 대답을 찾은 것을 기쁘게 생각합니다. 현재 다른 약속이 있기 때문에 다른 프로젝트에는 참여할 수 없습니다. 나는 항상 여기에 게시 된 pyqt/pyside 관련 질문을 볼 것입니다. 나는 항상 그 (것)들에 응답 할 수있을 것이라는 점을 약속 할 수 없다 - 그러나 나는 나가 추가하게 유용한 무언가가다는 것을 나는 생각하면 적어도 논평 할 것이다. – ekhumoro

+0

나는 이해한다. 재능있는 사람들은 종종 바쁘습니다. 저는 Python과 Qt를 처음 접했고 PySide 또는 PySide2를 사용하는 데 필요한 일반적인 응용 프로그램 지침 (컨설팅) 및 공식 교육을 찾고 있습니다. 온라인에서 사용할 수있는 많은 자습서를 살펴 보았지만 접근 방법은 조금씩 다를 수 있습니다. Qt 회사는 현재 PySide 교육을 제공하지 않는 것으로 보이며 주제에 관한 최근의 책이 없습니다. 조언 있니? Python을 배우고 Qt의 C++ 및 PySide 이전 매뉴얼 페이지를 통해 고민 할 수있는 유일한 방법입니까? – davideps