2011-01-19 19 views
5

Modelimi tanımlamak için SQLAlchemy bildirimsel tabanı kullanıyorum. ,SQLAlchemy: tablo alanına göre özel özelliği sorgula

Session.query(Entry).filter(Entry.name == my_name).first() 
>>> ArgumentError: filter() argument must be of type sqlalchemy.sql.ClauseElement or string 

bir süre araştırdıktan sonra:

name kullanarak bir sorgu gerçekleştirmek için çalışıyor
class Entry(Base): 
    __tablename__ = "blog_entry" 
    id = Column(Integer, primary_key=True) 
    title = Column(Unicode(255)) 
    ... 

    @property 
    def name(self): 
     return re.sub(r'[^a-zA-Z0-9 ]','',self.title).replace(' ','-').lower() 

, SQLAlchemy bir hata atar: Ben sütunlar (title) birinden hesaplanır bir özellik name tanımlanmış Belki de comparable_using()'un yardımcı olabileceğini buldum, ancak tablonun başka bir sütununa başvuran bir karşılaştırıcı gösteren bir örnek bulamadım.

Bu mümkün mü yoksa daha iyi bir yaklaşım var mı?

cevap

5

Sorgunuz için SQL'in hangi sürümde verilmesi gerektiğini hayal edebiliyor musunuz? Veritabanı, name hakkında hiçbir şey bilmiyor, bunu hesaplamanın bir yolu ya da aramayı hızlandırmak için herhangi bir endeksi kullanmadı.

Benim en iyi seçeneğim, her kayıt için title getirerek tam bir taramadır, ardından name hesaplanarak filtrelenir. Bunu [x for x in Session.query(Entry).all() if x.name==my_name][0] ile yapabilirsiniz. Biraz daha fazla karmaşıklıkla, yalnızca id ve title filtreleme geçişinde getirilir ve daha sonra tüm kayıtları id ile getirebilirsiniz.

Tam bir tarama işleminin, tablonuz çok küçük olmadıkça, performans POV'undan genellikle iyi olmadığını unutmayın. Bunu kullanarak hybrid_property elde edebilirsiniz sqlalchemy 0.7 itibaren

+0

sayesinde, artık başka bir yaklaşım deneyin gerektiğini görüyoruz. – amercader

5
+0

Yukarıdaki gibi bir dize yapmak için nasıl kullanılacağını gösteren bir örnek vermek mümkün mü? 'TypeError: beklenen string veya buffer' ve 'AttributeError: Ne 'InstrumentedAttribute' nesnesi ne de Entry.page_title ile ilişkili 'Comparatorer' nesnesinin 'bölüm' özelliğine sahip olduğu şeyleri alıyorum, ancak page_title nesnelerini nesnem gibi davranmaya çalışıyorum Gördüğüm bir dize değil ... Dize değeri nasıl olsa da emin değilim. – Katie