2016-03-06 4 views
6

Programlı bir arama sorgusu oluşturmaya çalışıyorum ve bunu yapmak için bir masaya katılıyorum.Önceden birleştirilen tabloları bulmak için bir sqlalchemy sorgu nesnesini denetleyebilir miyim?

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

Bu biraz karmaşık bir örnektir - Umarım mantıklıdır.

benim arama fonksiyonu şey gibi görünüyor ki: Daha önce

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 

, ben zaten bir listede katıldı ne tabloları takip sakladım ve tablo listesinde ise, bu zaten farz katıldı ve sadece filtreyi ekleyin.

Sorgu nesnesine bakabilseydim, Tag zaten eklendiyse ve böyle bir durumda atlamanız güzel olur. Bundan daha fazla fayda sağlayacak daha karmaşık bir sorgulama yapıyorum.

Kaybettiğim aramalar için sorgu oluşturma konusunda tamamen farklı bir strateji varsa, bu da harika olur. Ya da yukarıdaki kod eğer tabloya iki kez katılırsa iyi olur, bu da harika bir bilgi. Herhangi bir yardım inanılmaz takdir! RMN cevap göre query._join_entities

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

"Zaten birleştirilmiş tabloyu bulun", yinelenen birleştirmeleri atlamanız gereken bir şeydir. Sorununuzu, zihninizde bir şekilde çözmek için gerekli araçları sormak her zaman iyi bir uygulamadır. Örneğin, "zaten birleştirilmişse bir tabloya nasıl katılmayı atla" seçeneğini sorun. – mtoloo

cevap

5

Sen katıldı bulabileceğiniz tablolar:

projenizin sizin başlatma bazı yerlerde, böyle sqlalchemy.orm.Query nesneye bir unique_join yöntemi ekleyin:

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 yerine query.unique_join kullanın:

query = query.unique_join(Tag) 
+0

Daha basit olamazdı. TEŞEKKÜRLER! – Hoopes

İlgili konular