sqlalchemy:如何通过一个查询连接多个表?

我有以下SQLAlchemy映射的类:

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

我需要得到这样的表user.email = "user@email.com"

 email | name | document_name | document_readAllowed | document_writeAllowed 

如何使用SQLAlchemy的一个查询请求? 下面的代码不适用于我:

 result = session.query(User, Document, DocumentPermission).filter_by(email = "user@email.com").all() 

谢谢,

尝试这个

 q = Session.query(User,Document,DocumentPermissions).filter(User.email == Document.author).\ filter(Document.name == DocumentPermissions.document).\ filter(User.email == 'someemail').all() 

一个好的风格是设置一些关系和权限的主键(实际上,通常是设置整数主键的好方法,但是不pipe):

 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_email = Column(String, ForeignKey("users.email")) author = relation(User, backref='documents') class DocumentsPermissions(Base): __tablename__ = "documents_permissions" id = Column(Integer, primary_key=True) readAllowed = Column(Boolean) writeAllowed = Column(Boolean) document_name = Column(String, ForeignKey("documents.name")) document = relation(Document, backref = 'permissions') 

然后用连接做一个简单的查询:

 query = session.query(User, Document, DocumentsPermissions).join(Document).join(DocumentsPermissions) 

这个函数将产生所需的表作为元组列表。

 def get_documents_by_user_email(email): query = session.query(User.email, User.name, Document.name, DocumentsPermissions.readAllowed, DocumentsPermissions.writeAllowed,) join_query = query.join(Document).join(DocumentsPermissions) return join_query.filter(User.email == email).all() user_docs = get_documents_by_user_email(email) 

扩展阿卜杜勒的答案,您可以通过join列获得一个KeyedTuple而不是离散的行集合:

 q = Session.query(*User.__table__.columns + Document.__table__.columns).\ select_from(User).\ join(Document, User.email == Document.author).\ filter(User.email == 'someemail').all()