J'ai les classes mappées SQLAlchemy suivantes:
class User(Base):
__tablename__ = 'users'
email = Column(String, primary_key=True)
name = Column(String)
class Document(Base):
__tablename__ = "documents"
name = Column(String, primary_key=True)
author = Column(String, ForeignKey("users.email"))
class DocumentsPermissions(Base):
__tablename__ = "documents_permissions"
readAllowed = Column(Boolean)
writeAllowed = Column(Boolean)
document = Column(String, ForeignKey("documents.name"))
J'ai besoin d'une table comme celle-ci pour user.email = "[email protected]"
:
email | name | document_name | document_readAllowed | document_writeAllowed
Comment peut-il être fait en utilisant une requête de requête pour SQLAlchemy? Le code ci-dessous ne fonctionne pas pour moi:
result = session.query(User, Document, DocumentPermission).filter_by(email = "[email protected]").all()
Merci,
python
sql
join
sqlalchemy
barankin
la source
la source
result = session.query(User, Document).select_from(join(User, Document)).filter(User.email=='[email protected]').all()
Mais je n'ai pas encore réussi à faire fonctionner de la même manière pour trois tables (pour inclure DocumentPermissions). Une idée?Réponses:
Essaye ça
la source
join
chose fait-il? intérieur, extérieur, croix ou quoi?[(<user>, <document>, <documentpermissions>),...]
/select x from a, b ,c
qui est une jointure croisée. Les filtres en font alors une jointure interne..all()
. Alorsprint Session.query....
pour voir exactement ce qu'il fait..filter()
peut recevoir plusieurs critères si séparés par des virgules. Est-il préférable d'en utiliser un.filter()
avec des séparations par virgule entre parenthèses, ou d'utiliser plusieurs.filter()
comme la réponse ci-dessus?Un bon style serait de configurer des relations et une clé primaire pour les autorisations (en fait, il est généralement bon de configurer des clés primaires entières pour tout, mais peu importe):
Ensuite, faites une simple requête avec des jointures:
la source
query
défini sur la dernière ligne et comment accéder aux enregistrements joints?Document
(2ème valeur de tuple) dans le jeu de résultats de la requête?for (user, doc, perm) in query: print "Document: %s" % doc
Comme l'a dit @letitbee, sa meilleure pratique consiste à attribuer des clés primaires aux tables et à définir correctement les relations pour permettre une interrogation ORM appropriée. Cela étant dit...
Si vous souhaitez rédiger une requête du type:
Ensuite, vous devriez opter pour quelque chose comme:
Si à la place, vous voulez faire quelque chose comme:
Ensuite, vous devriez faire quelque chose du genre:
Une note à ce sujet ...
Pour plus d'informations, consultez la documentation .
la source
En développant la réponse d'Abdul, vous pouvez obtenir une
KeyedTuple
collection de lignes au lieu d'une collection discrète de lignes en joignant les colonnes:la source
Cette fonction produira la table requise sous forme de liste de tuples.
la source