2016-10-24 75 views
0

我有2個表:用戶和組SQLAlchemy的查詢返回數據

類的聲明是這樣的:

class Groups(Base): 
    __tablename__ = 'groups' 

    group_id = Column(Integer, primary_key=True) 
    group_name = Column(Unicode(32)) 
    user = relationship('User') 

class User(Base): 
__tablename__ = 'user' 

user_id = Column(Integer, primary_key=True) 
name = Column(Unicode(64)) 
email = Column(Unicode(64)) 
group_id = Column(Integer, ForeignKey('groups.group_id')) 

於是一羣ID可以有多個USER_ID的附着它。現在

,我想查詢上表所示:

user_list_incomplete1 = DBSession.query(User.name, User.user_id, Groups.group_name).filter(User.group_id == Groups.group_id).order_by(User.user_id).all() 

查詢適用於那些有一組ID聲明,但沒有返回值(空單​​),如果該字段爲空的用戶。

即使對於沒有組標識的用戶行,我應該如何編寫查詢以獲取數據?

回答

0

您定義的關係默認會導致inner join。你想在這裏什麼是outer join

喜歡的東西:

user_list_incomplete1 = DBSession.query(User.name, User.user_id, Groups.group_name)\ 
    .outerjoin(Groups)\ 
    .filter()... etc 

有意義嗎?無論外鍵是否匹配,外連接都將顯示兩個表的所有記錄。

+0

刪除filter_by()子句並保持外連接(Groups)給了我正確的結果。謝謝karimtabet! –

+0

不用擔心。值得注意的是,雖然我的答案爲您的問題提供了一個解決方案。這實際上並不是一個標準化的解決方案。規範化表不應允許空值(即group_id)。理想情況下,您將擁有一個關聯表,由組和用戶的外鍵組成。但這是另一個故事;) –

+0

在我的'組'表中,我提到了'用戶'表的外鍵。 group_id字段爲空的唯一一點在'用戶'表中,並且在用戶初始化時。之後,管理員將能夠將其分配給已經存在的組。無論如何感謝您的建議:) –