2012-04-05 31 views
1

我有被定義爲三個表:SQLAlchemy的查詢與多個有條件的地方

class User(Base): 
    __tablename__ = 'users' 

    id = Column(Integer(10), primary_key=True) 
    firstname = Column(String(64)) 
    surname = Column(String(64)) 

class SWMS(Base): 
    __tablename__ = 'swms' 
    id = Column(Integer(10), primary_key=True) 
    owner_id = Column(Integer(10), ForeignKey('users.id', ondelete='CASCADE')) 
    filename = Column(String(255)) 

    swmowner = relationship('User', backref=backref('users')) 

class SWM_perms(Base): 
    __tablename__ = 'swm_perms' 
    id = Column(Integer(10), primary_key=True) 
    swm_id = Column(Integer(10), ForeignKey('swms.id', ondelete='CASCADE')) 
    user_id = Column(Integer(10), ForeignKey('users.id', ondelete='CASCADE')) 

    swm = relationship('SWMS', backref=backref('swms')) 
    swmuser = relationship('User', backref=backref('swmusers')) 

從本質上講,SWMS表的文檔信息,其中owner_id定義誰創建的文檔的用戶的表。 SWM_perms是一個表格,它具有文檔ID到用戶ID的映射 - 定義哪些用戶被允許查看文檔。

以產生要麼1)由用戶擁有或2)都可以查看用戶的所有文件的表,在SQL我會做:

select owner_id, users.firstname, users.surname, filename 
from swms, swm_perms, users 
where users.id=swms.owner_id and 
    ((swms.id=swm_perms.swm_id and swm_perms.user_id = 27) or (owner_id = 27)); 

你如何定義在SQLAlchemy的這個查詢?我熟悉or_()函數,但我嘗試的變體不會生成正確的對象。

回答

6
cond1 = and_(SWMS.id==SWM_perms.swm_id,SWM_perms.user_id==27) 
swms = DBSession.query(User,SWMS).filter(or_(cond1,SWMS.owner_id==27)).\ 
            filter(User.id==SWMS.owner_id).all() 

,然後你可以做一個列表理解拉你想要的字段:

details = [(u.firstname, s.filename, s.blob_key, s.last_modified) for u,s in swms]