Ich habe die folgenden SQLAlchemy-Klassen zugeordnet:
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"))
Ich brauche einen Tisch wie diesen für user.email = "[email protected]"
:
email | name | document_name | document_readAllowed | document_writeAllowed
Wie kann es mit einer Abfrageanforderung für SQLAlchemy gemacht werden? Der folgende Code funktioniert bei mir nicht:
result = session.query(User, Document, DocumentPermission).filter_by(email = "[email protected]").all()
Vielen Dank,
python
sql
join
sqlalchemy
Barankin
quelle
quelle
result = session.query(User, Document).select_from(join(User, Document)).filter(User.email=='[email protected]').all()
Aber ich habe es noch nicht geschafft, die Arbeit für drei Tabellen ähnlich zu machen (einschließlich DocumentPermissions). Irgendeine Idee?Antworten:
Versuche dies
quelle
join
macht es? inner, äußer, kreuz oder was?[(<user>, <document>, <documentpermissions>),...]
/select x from a, b ,c
eine Cross-Join haben. Die Filter machen es dann zu einer inneren Verbindung..all()
. Alsoprint Session.query....
genau sehen, was es tut..filter()
dass mehrere Kriterien erhalten werden können, wenn durch Kommas getrennt. Ist es vorzuziehen, eine.filter()
mit Komma-Trennungen in Klammern zu verwenden oder mehrere.filter()
wie in der obigen Antwort zu verwenden?Ein guter Stil wäre das Einrichten einiger Beziehungen und eines Primärschlüssels für Berechtigungen (normalerweise ist es ein guter Stil, ganzzahlige Primärschlüssel für alles, aber was auch immer, einzurichten):
Führen Sie dann eine einfache Abfrage mit Joins durch:
quelle
query
in der letzten Zeile eingestellt und wie greifen Sie auf die darin enthaltenen verknüpften Datensätze zu?Document
(2. Tupelwert) in der Abfrageergebnismenge zu?for (user, doc, perm) in query: print "Document: %s" % doc
Wie @letitbee sagte, empfiehlt es sich, Tabellen Primärschlüssel zuzuweisen und die Beziehungen richtig zu definieren, um eine ordnungsgemäße ORM-Abfrage zu ermöglichen. Davon abgesehen ...
Wenn Sie daran interessiert sind, eine Abfrage wie folgt zu schreiben:
Dann sollten Sie sich für etwas entscheiden wie:
Wenn Sie stattdessen etwas tun möchten wie:
Dann sollten Sie etwas in der Art tun:
Ein Hinweis dazu ...
Weitere Informationen finden Sie in den Dokumenten .
quelle
Wenn Sie Abdul's Antwort erweitern, können Sie eine
KeyedTuple
anstelle einer diskreten Sammlung von Zeilen erhalten, indem Sie die Spalten verbinden:quelle
Diese Funktion erzeugt die erforderliche Tabelle als Liste der Tupel.
quelle