2016-03-06 2 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が既に参加していることを確認し、そうであればスキップしてください。私は実際にこれから恩恵を受けるいくつかのより複雑なクエリビルドを持っています。

私が逃した検索のためのクエリ構築のための全く別の戦略がある場合、それも素晴らしいでしょう。または、上記のコードが2回テーブルに加わるとうまくいけば、それは素晴らしい情報です。どんな助けも信じられないほど高く評価されています!

+0

"既に結合されたテーブルを検索"は、重複した結合をスキップする必要があることです。問題をあなたの心の中で解決する手段ではなく、常にそれを尋ねるのは良い習慣です。たとえば、「すでに結合されている場合は、テーブルへの結合をスキップする方法」を尋ねることができます。 – mtoloo

答えて

5

あなたはRMNの答えによるとquery._join_entities

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

もっと簡単ではありません。ありがとう! – Hoopes

1

に結合されたテーブルを見つけることができます、

プロジェクトのあなたの初期のいくつかの場所をこのようなsqlalchemy.orm.Queryオブジェクトにunique_joinメソッドを追加します。

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.joinの代わりにquery.unique_joinを使用してください:

query = query.unique_join(Tag)