2010-01-31 6 views
9

Supponiamo che io sono le seguenti tabelle:Come fare un JOIN in SQLAlchemy su 3 tabelle, dove uno di loro sta mappando tra gli altri due?

  • Articles con campi article_id, title
  • Tags con campi tag_id, name
  • ArticleTags con campi article_id, tag_id

e mi auguro di trovare tutti gli articoli che hanno un determinato tag. Come posso creare questo complicato join in SQLAlchemy?

In SQL sarebbe simile:

SELECT a.article_id, a.title FROM Articles AS a 
JOIN ArticleTags AS at ON a.article_id = at.article_id 
JOIN Tags  AS t ON at.tag_id = t.tag_id 
WHERE t.name = 'tag_name' 

io non riesco a capire come farlo in SQLAlchemy. Sto usando ArticleTags solo come tabella "secondaria" e non riesco a capire come coinvolgerlo nel JOIN.

Qualcuno può aiutare?

Grazie, Boda Cydo.

risposta

8

Supponendo di aver impostato correttamente i vincoli ForeignKey e creato mapper:

q = Session.query(Articles).filter(Articles.article_id == ArticleTags.article_id).\ 
    filter(ArticleTags.tag_id == Tags.tag_id).\ 
    filter(Tags.name == 'tag_name') 

Se si dispone di installazione di una relazione molti-a-molti relazione è ancora più semplice:

q = Session.query(Articles).filter(Articles.tags.any(name = 'tag_name')) 

Per alcuni altri esempi per le query relative ai blog guarda here.

Se si utilizza il linguaggio di espressione sql, è necessario che sia traducibile direttamente.

+0

Sembra buono. Ma un problema: non ho mappato 'ArticleTags 'in nessuna classe. Uso semplicemente 'ArticleTags' nella clausola secondaria nelle classi mappate' Articoli' e 'Tag'. Dovrei mappare 'ArticleTags' in una classe allora? – bodacydo

+0

Se questo non funziona, dovrai fornire le parti rilevanti del tuo modello. – ebo

+0

La seconda soluzione funziona ma ho notato che effettua una sotto-selezione. I sottoselezionati sono OK? – bodacydo

Problemi correlati