2011-01-19 8 views
5

私のモデルを定義するためにSQLAlchemy宣言ベースを使用しています。 、SQLAlchemy:テーブルフィールドに基づくクエリカスタムプロパティ

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

しばらく調査した後:

nameを使用してクエリを実行しようとしている
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のは、エラーがスローされます。私は、列(title)1から計算されたプロパティが定義されname私はおそらくcomparable_using()助けることができるが、私はテーブルの別の列を参照するコンパレータを示す任意の例を見つけることができませんでした。

これも可能ですか、それとも良い方法がありますか?

答えて

5

クエリに対して発行するSQLを想像できますか?データベースはnameについて何も知らないので、それを計算する方法も、インデックスを使用して検索を高速化することもできません。

私のベスト・ベットはフル・スキャンで、すべてのレコードに対してtitleを取り出し、nameと計算してフィルタリングします。あなたは生まれながらに[x for x in Session.query(Entry).all() if x.name==my_name][0]でそれを行うことができます。もう少し洗練されていれば、フィルタリングパスでidtitleしか取得せず、フルレコードをidで取得します。

テーブルが非常に小さい場合を除き、フルスキャンは通常、パフォーマンスPOVからうまくいかないことに注意してください。あなたはこの使用hybrid_property を達成することができますSQLAlchemyの0.7から

+0

おかげで、私は今、私は別のアプローチを試みなければならないことがわかります。 – amercader

5

はこちらのドキュメントを参照してください。http://www.sqlalchemy.org/docs/orm/extensions/hybrid.html

+0

これを使用して上記のように文字列を置換する方法の例を挙げることはできますか? 'TypeError:expected string or buffer'と' AttributeError:Entry.page_titleに関連付けられている 'InstrumentedAttribute'オブジェクトも 'Comparator'オブジェクトも属性 'partition''を持っていませんが、私のオブジェクトpage_titleを次のように扱っています。私はそれを見ることができる文字列...文字列の値を取得する方法をよく分からない。 – Katie

関連する問題