在sqlalchemy中,当输入多个单词时,可以或uu查看两列吗?

在sqlalchemy中,当输入多个单词时,可以或uu查看两列吗?,sql,sqlalchemy,Sql,Sqlalchemy,我有以下命令,可以正常工作: DBSession.query(Users).filter(or_(Users.first_name.contains(search_term),Users.last_name.contains(search_term))).all() 我在Users表中搜索名字和姓氏,因此我可以通过搜索bob或smith来查找bob smith,但搜索bob smith时没有结果。这显然是因为bob在first_name列中,而不是bob smith,所以失败了。但是有没有一种

我有以下命令,可以正常工作:

DBSession.query(Users).filter(or_(Users.first_name.contains(search_term),Users.last_name.contains(search_term))).all()
我在Users表中搜索名字和姓氏,因此我可以通过搜索
bob
smith
来查找
bob smith
,但搜索
bob smith
时没有结果。这显然是因为bob在first_name列中,而不是bob smith,所以失败了。但是有没有一种方法可以在sqlalchemy中进行这种搜索呢


我知道最糟糕的情况是我可以用全名创建一个专栏,但我想我会问一下,以防万一。我还将其标记为sql,以防使用原始sql时可能出现这种情况,然后我将尝试根据原始查询重新生成sqlalchemy版本。

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

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