0

我有以下命令可以按预期工作:

DBSession.query(Users).filter(or_(Users.first_name.contains(search_term),Users.last_name.contains(search_term))).all()

我在我的用户表中搜索名字和姓氏,所以我可以bob smith通过搜索bob或找到smith,但是当我搜索时我没有得到任何结果bob smith。这显然是因为 bob 在 first_name 列中,而不是bob smith因此失败。但是有没有办法在 sqlalchemy 中进行这种搜索?

我知道最糟糕的是我可以创建一个全名的列,但我想我会问一下,以防万一。我还将其标记为 sql,以防万一它可能使用原始 sql,然后我将尝试根据原始查询找出 sqlalchemy 版本。

4

1 回答 1

1

实现这一点的最简单方法是使用混合属性扩展:

from sqlalchemy.ext.hybrid import hybrid_property

class User(Base):
    #...
    first_name = Column(String, nullable=False)
    last_name = Column(String, nullable=False)

    @hybrid_property
    def full_name(self):
        return self.first_name + " " + self.last_name

    @hybrid_property
    def _full_name_last_first(self):
        """ @note: used only for search [last, first].  """
        return self.last_name + ", " + self.first_name

def test_search(search_term):
    q = session.query(User)
    q = q.filter(
            or_(
                User.first_name.contains(search_term),
                User.last_name.contains(search_term),
                User.full_name.contains(search_term),
                User._full_name_last_first.contains(search_term),
                ),
            )
    q = q.order_by(User.id)
    return q.all()

r1 = test_search('John Williams')
assert len(r1) == 1

r1 = test_search('Williams, Jo')
assert len(r1) == 1
于 2012-07-19T09:19:52.737 回答