2017-10-02 6 views
1

J'essaie de comprendre l'avantage d'utiliser QSqlRelationalTableModel par rapport à QSqlTableModel lorsque je traite des tables liées par des ID uniques. Dans l'exemple suivant, le champ d'organisation est correctement affiché par nom et non par numéro d'ID. Toutefois, comment accéder aux champs "size" ou "address" correspondants de l'enregistrement lié?Obtenir des valeurs dans une ou plusieurs tables jointes à l'aide de 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) 

Répondre

1

Il est une caractéristique qui manque ici, qui a été rapporté comme QTBUG-9320. Plus précisément, il n'existe aucun moyen évident d'obtenir la valeur de clé étrangère d'origine de la table associée.

Heureusement, il existe une solution de contournement non documentée qui évite le problème. Cela fonctionne en exploitant le troisième argument de QSqlRelation, qui est en fait en mesure de spécifier plus d'une colonne dans le résultat.

Voici comment obtenir que cela fonctionne dans votre exemple:

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))) 

sortie:

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

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

Le relTblAl_3.id est nécessaire pour éviter les conflits de noms, et est documenté dans les notes au fin du Detailed Description for QSqlRelationalTableModel. Toutefois, cela peut être évité si vous utilisez toujours des noms uniques pour chaque colonne (par exemple, en utilisant org_id au lieu de id ne nécessiterait alors pas de qualification avec le nom de la table).

+0

Merci. Bien que la fonctionnalité "relTblAl_3" soit documentée, elle semble obscure. Peu importe, je suis content que ça existe. Vous avez répondu à chacune de mes questions PySide au cours des dernières semaines. Existe-t-il un moyen de vous contacter directement en ce qui concerne un projet? – davideps

+0

@davideps. Je suis content que vous ayez trouvé mes réponses utiles. Pour le moment, je crains de ne pouvoir m'engager dans aucun autre projet, car j'ai déjà d'autres engagements. Je vais toujours regarder toutes les questions relatives pyqt/pyside qui sont affichées ici, cependant. Je ne peux pas promettre que je serai toujours capable d'y répondre - mais je ferai au moins un commentaire si je pense avoir quelque chose d'utile à ajouter. – ekhumoro

+0

Je comprends. Les gens talentueux sont souvent occupés :) Je suis nouveau à la fois Python et Qt et je suis à la recherche de conseils d'application générale (conseil) et une formation formelle à l'utilisation de PySide ou, mieux encore, PySide2. J'ai parcouru plusieurs des tutoriels disponibles en ligne, mais l'approche semble fragmentaire. La compagnie Qt ne semble pas offrir de formation PySide pour le moment et il n'y a pas de livres récents sur le sujet. Avez-vous des conseils? Est-ce que ma seule option pour apprendre Python par lui-même et lutter à travers le C++ et les anciennes pages de manuel PySide pour Qt? – davideps