2011-01-19 12 views
5

Używam deklaratywnej podstawy SQLAlchemy do zdefiniowania mojego modelu. I określono właściwość name który oblicza się z jednej kolumny (title):SQLAlchemy: właściwość niestandardowa zapytania w oparciu o pole tabeli

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

Podczas próby wykonania kwerendy przy użyciu name, SQLAlchemy zgłasza błąd:

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

Po zbadaniu przez chwilę, Zauważyłem, że może pomóc może comparable_using(), ale nie mogłem znaleźć żadnego przykładu pokazującego komparator, który odwołuje się do innej kolumny tabeli.

Czy to możliwe, czy jest lepsze podejście?

Odpowiedz

5

Czy możesz sobie wyobrazić, jaki kod SQL powinien zostać wysłany dla twojego zapytania? Baza danych nie wie nic o name, nie ma ani sposobu na jej obliczenie, ani nie używa żadnego indeksu do przyspieszenia wyszukiwania.

Mój najlepszy zakład to pełne skanowanie, pobieranie title dla każdego rekordu, obliczanie name, a następnie filtrowanie przez niego. Możesz to zrobić po prostu przez [x for x in Session.query(Entry).all() if x.name==my_name][0]. Przy odrobinie wyrafinowania wystarczy pobrać id i title w przejściu filtrującym, a następnie pobrać pełny rekord (y) przez id.

Pamiętaj, że pełne skanowanie zwykle nie jest przyjemne z POV, chyba że Twój stół jest dość mały.

+0

Dzięki, teraz widzę, że muszę spróbować innego podejścia. – amercader

5

Od sqlalchemy 0,7 Można to osiągnąć za pomocą hybrid_property zobaczyć docs tutaj: http://www.sqlalchemy.org/docs/orm/extensions/hybrid.html

+0

Czy można podać przykład użycia tego do zastąpienia ciągu jak powyżej? Otrzymuję takie rzeczy jak "TypeError: oczekiwany ciąg lub bufor" i "AttributeError: Ani" InstrumentedAttribute "obiekt, ani" Komparator "obiekt powiązany z Entry.page_title ma atrybut" partition ", ale próbuję traktować moje obiekty page_title jako ciąg znaków, który widzę, nie jest ... Nie wiem, jak uzyskać wartość ciągu. – Katie

Powiązane problemy