SQLAlchemy:根据表字段查询自定义属性

时间:2011-01-19 17:03:15

标签: python sqlalchemy

我正在使用SQLAlchemy声明性基础来定义我的模型。我定义了一个属性name,它是从一列(title):

计算出来的
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()

尝试使用name执行查询时,SQLAlchemy会抛出错误:

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

经过一段时间的调查后,我发现可能comparable_using()可能会有所帮助,但我找不到任何显示比较器引用该表另一列的示例。

这是否可行或是否有更好的方法?

2 个答案:

答案 0 :(得分:5)

你能想象应该为你的查询发出什么SQL吗?数据库对name一无所知,它既没有计算方法,也没有使用任何索引来加速搜索。

我最好的选择是完整扫描,为每条记录提取title,计算name然后按其过滤。您可以通过[x for x in Session.query(Entry).all() if x.name==my_name][0]原始执行此操作。如果更复杂一点,您只需在过滤过程中获取idtitle,然后按id获取完整记录。

请注意,从性能POV开始,完整扫描通常不太好,除非您的表格非常小​​。

答案 1 :(得分:5)

从SqlAlchemy 0.7开始,您可以使用hybrid_property实现此目的 请参阅此处的文档:http://www.sqlalchemy.org/docs/orm/extensions/hybrid.html