0

期待どおりに機能する次のコマンドがあります。

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内でこの種の検索を行う方法はありますか?

最悪の場合、フルネームで列を作成できることはわかっていますが、可能であれば念のために質問したいと思いました。また、raw sqlで可能である場合に備えて、これをsqlとしてタグ付けしています。その後、rawクエリに基づいて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 に答える