2016-03-06 41 views
6

Sto provando a creare una query di ricerca a livello di codice e, per farlo, mi unisco a un tavolo.Posso esaminare un oggetto query sqlalchemy per trovare le tabelle già unite?

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

Questo è un esempio un po 'forzato: spero che abbia senso.

Dire il mio funzione di ricerca simile a:

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 

In precedenza, ho tenuto traccia di ciò che le tabelle che sono già state unite in un elenco, e se la tabella è nella lista, assumere è già unito, e basta aggiungere il filtro.

Sarebbe bello se potessi guardare l'oggetto query, vedere che Tag è già unito e saltare se lo è. Ho un po 'più complesso di query che potrebbe davvero trarne beneficio.

Se esiste una strategia completamente diversa per la creazione di query per le ricerche che ho perso, sarebbe fantastico. Oppure, se il codice di cui sopra va bene se mi unisco al tavolo due volte, questa è un'ottima informazione. Qualsiasi aiuto è incredibilmente apprezzato !!!

+0

"Trova la tabella già unita" è una cosa che è necessario saltare i join duplicati. È sempre una buona pratica chiedere al tuo problema non i mezzi per risolverlo in un modo nella tua mente. Ad esempio chiedi "come saltare ad un tavolo se è già unito". – mtoloo

risposta

5

tabelle È possibile trovare uniti in query._join_entities

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

Non potrebbe essere più semplice. GRAZIE! – Hoopes

1

Secondo la risposta RMN:

Alcuni dove nel tuo inizializzazione del progetto, aggiungere un metodo unique_join all'oggetto sqlalchemy.orm.Query in questo modo:

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 

Ora utilizzare query.unique_join anziché query.join:

query = query.unique_join(Tag)