2016-03-06 8 views
6

Próbuję programowo zbudować kwerendę wyszukiwania, a do tego dołączam do tabeli.Czy mogę sprawdzić obiekt zapytań sqlalchemy, aby znaleźć już połączone tabele?

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

To jest trochę wymyślny przykład - mam nadzieję, że ma to sens.

Say my funkcja wyszukiwania wygląda mniej więcej tak:

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 

Wcześniej ja śledził co tabel, które zostały już połączone w liście, a jeśli tabela znajduje się na liście, załóżmy, że to już dołączył i po prostu dodaj filtr.

Byłoby fajnie, gdybym mógł spojrzeć na obiekt zapytania, zobacz, czy Tag jest już połączony, i pomiń go, jeśli tak. Mam bardziej złożony proces tworzenia zapytań, który naprawdę skorzystałby na tym.

Jeśli istnieje zupełnie inna strategia budowania zapytań dla wyszukiwań, które przeoczyłem, to też byłoby świetnie. Lub, jeśli powyższy kod jest w porządku, jeśli dołączę do stołu dwa razy, to także świetna informacja. Każda pomoc jest niewiarygodnie ceniona !!!

+0

"Znajdź już połączoną tabelę" to rzecz, którą należy pominąć zduplikowane połączenia. Zawsze dobrą praktyką jest zadawanie problemu, a nie sposób rozwiązania go w pewien sposób w umyśle. Na przykład zapytaj "jak pominąć dołączanie do tabeli, jeśli jest już połączone". – mtoloo

Odpowiedz

5

może znajdziesz połączone tabele w query._join_entities

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

Nie może być prostsze. DZIĘKI! – Hoopes

1

Zgodnie z odpowiedzią RMN:

Niektóre gdzie w inicjalizacji projektu, dodać metodę unique_join do obiektu jak to 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 

Teraz użyj query.unique_join zamiast query.join:

query = query.unique_join(Tag) 
Powiązane problemy