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

ame*_*der 6 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()
Run Code Online (Sandbox Code Playgroud)

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

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

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

这是可能的还是有更好的方法?

mar*_*ski 7

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


900*_*000 5

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

我最好的选择是全扫描,获取title每条记录,计算name然后通过它进行过滤.你可以原则地做到这一点[x for x in Session.query(Entry).all() if x.name==my_name][0].稍微复杂一点,你只需要获取idtitle在过滤过程中,然后获取完整的记录id.

请注意,除非您的表非常小,否则从性能POV开始,完整扫描通常并不好.