2010-01-31 9 views
9

Farz edelim:Biri SQLAlchemy'de bir JOIN nasıl 3 tablodan yapılır, bunlardan biri diğer ikisi arasında haritalanıyor?

  • Articles ile article_id, title
  • Tags alanları tag_id, name
  • ArticleTagsarticle_id, tag_id

belirli bir etiketi olan makaleler. SQLAlchemy'de bu karmaşık birleşimi nasıl oluştururum?

SQL'de şöyle görünecektir:

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' 

SQLAlchemy'de nasıl yapılacağını anlayamıyorum. Xzx34'ü yalnızca "ikincil" tablo olarak kullanıyorum ve JOIN'e nasıl dahil edileceğini anlayamıyorum.

Herkes yardımcı olabilir mi?

Teşekkürler, Boda Cydo.

cevap

8

doğru ForeignKey kısıtlamaları ayarlamak varsayarsak ve yaratılan haritacılar:

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

Eğer ayarlarınız varsa ilişki o Birçok-çok daha basit bir: Bazı Daha fazla örnek için

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

Blogla ilgili sorgular için here'a bakın.

sql ifade dilini kullanırsanız, düz ileri aktarılabilir olmalıdır.

+0

Güzel görünüyor. Ama bir problem - 'ArticleTags'ı herhangi bir sınıfa çizmedim. Sadece 'ArticleTags' makaleleri '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' 'ArticleTags'ı bir sınıfla eşleştirmeli miyim? – bodacydo

+0

Bu işe yaramazsa, modelinizin ilgili bölümlerini vermeniz gerekir. – ebo

+0

Siz 2. çözüm çalışıyorsunuz ama bir alt seçim yaptıklarını fark ettim. Alt seçim tamam mı? – bodacydo

İlgili konular