2016-03-06 94 views
6

我想以編程方式構建搜索查詢,並且要這樣做,我要加入一個表。我可以檢查sqlalchemy查詢對象以查找已連接的表嗎?

class User(db.Model): 
    id = db.Column(db.Integer(), primary_key=True) 

class Tag(db.Model): 
    id = db.Column(db.Integer(), primary_key=True) 
    user_id = db.Column(db.Integer(), db.ForeignKey('user.id')) 
    title = db.Column(db.String(128)) 
    description = db.Column(db.String(128)) 

這是一個有點人爲的例子 - 我希望它是有道理的。

說我的搜索功能看起來像:

def search(title_arg, desc_arg): 
    query = User.query 
    if title_arg: 
     query = query.join(Tag) 
     query = query.filter(Tag.title.contains(title_arg)) 
    if desc_arg: 
     query = query.join(Tag) 
     query = query.filter(Tag.description.contains(desc_arg)) 

    return query 

以前,我一直保留着的軌道,已經在列表中加入了什麼樣的表,如果表是在列表中,假設它已經加入,並添加過濾器。

如果我可以查看查詢對象,請參閱Tag已加入,如果是,則跳過它會很酷。我有一些更復雜的查詢構建,真的會從中受益。

如果對於我錯過的搜索構建查詢有一個完全不同的策略,那也會很棒。或者,如果上面的代碼很好,如果我加入表格兩次,那也是很好的信息。任何幫助都令人難以置信的讚賞!在query._join_entities

joined_tables = [mapper.class_ for mapper in query._join_entities] 
+0

「查找已連接的表」是您需要跳過重複連接的事情。問你的問題不是解決問題的方法,總是一種很好的做法。例如,詢問「如果已經加入,如何跳過加入表格」。 – mtoloo

回答

5

您可以找到連接表按照RMN答案:

在你的項目中初始化一些地方,添加一個unique_join方法將sqlalchemy.orm.Query對象是這樣的:

def unique_join(self, *props, **kwargs): 
    if props[0] in [c.entity for c in self._join_entities]: 
     return self 
    return self.join(*props, **kwargs) 

Query.unique_join = unique_join 

現在使用query.unique_join代替query.join

query = query.unique_join(Tag) 
+0

不可能更簡單。謝謝! – Hoopes

相關問題