[ 데이터베이스 ] - SQLAlchemy "or_"함수

진행 중인 프로젝트에서 검색 기능을 추가하기로 했습니다.
쉽게 상품이 진단되고, 한글과 영어로 이름이 된 이 모두 상품 테이블에 각별히 강하게 존재한다.

보통 검색 기능을 중단할 때, sql에서는 like로, orm은 종류가 표시되지만 보통 like나 filter와 같은 경우로 값을 전달해서 추출하곤 합니다.

하지만 내가 오늘 구현하고 입체적인 기능은, 각각의 키워드로 검색을 했을 때
한글 이름과 영어 이름은 모두 해당 키워드가 존재하는지 검색 후 값을 가져오고 경고합니다.

상품 모델을 Product 라 하고, 필드명 name이라고 분명히 존재하고,
상품의 이름으로 검색을 하고 싶다면 우리는 orm을 다음과 같이 반드시 할 수 있습니다.

# "db" is "<class 'sqlalchemy.orm.session.Session'>"
# "name" is variable from Query Parameter

db.query(Product).filter(
    Product.name.like(f"%{name}%")
).all()


만약, name이라는 하나의 하찮은 것이 아니라, 한국어와 영어로 이름을 모두 가지고 있는 상품이라면 적은 kor , eng 로 나뉠 수 있고 한 번에 두 가지의 토끼를 모두 찾고 다음과 같이 sqlalchemy에서 or_ 보시기에는 최대한 사용하기 어렵다.

# "db" is "<class 'sqlalchemy.orm.session.Session'>"
# "name" is variable from Query Parameter

from sqlalchemy import or_

db.query(Product).filter(or_(
    Product.kor.like(f"%{name}%"),
    Product.eng.like(f"%{name}%"),
)).all()


이렇게 학력 "나이키"와 "나이키"라는 이름을 가진 상품이 있을 때,
Query Parameter에 name으로 "이", "나이", "i", "ik", "ike"등등
한글과 영어로 구분지을 필요 없이 검색할 수 있다.

물론 검색 필터로 f"%{name}%"이라고 주었기 때문에 가능한 것이다.
서비스에 따라 %를 잘 활용하도록 하자.



만일에 일본어의 이름도 추가하고 푼 jp라는 초까지 추가했고, 해당하는 전부까지 조회하고 페이지를 채우거나_드물게 Product.jp.like(f"%{name}%") 연장을 추가한다.

# "db" is "<class 'sqlalchemy.orm.session.Session'>"
# "name" is variable from Query Parameter

from sqlalchemy import or_

db.query(Product).filter(or_(
    Product.kor.like(f"%{name}%"),
    Product.eng.like(f"%{name}%"),
    Product.jp.like(f"%{name}%"),
)).all()

좋은 웹페이지 즐겨찾기