DEV Community

Cover image for [ Database ] - SQLAlchemy "or_" function
Minho Lee
Minho Lee

Posted on

[ Database ] - SQLAlchemy "or_" function

진행중인 프로젝트에서 이번에 검색 기능을 추가하기로 했다.
쉽게 상품이 있는데, 한글과 영어로 된 이름이 모두 상품 테이블에 각 컬럼별로 존재한다.

보통 검색기능을 구현할 때, 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()
Enter fullscreen mode Exit fullscreen mode

그런데 만약, 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()
Enter fullscreen mode Exit fullscreen mode

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

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

만약에 일본어의 이름도 추가하고 싶어서 jp라는 컬럼까지 추가했고, 해당 컬럼까지 조회하고 싶다면 or_ 함수에 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()
Enter fullscreen mode Exit fullscreen mode

Top comments (0)