본문 바로가기
Python/Flask

SQLAlchemy - filter + 조회 예시

by 쿠리의일상 2024. 3. 7.

SQLAlchemy 를 사용하고 있으나 filter 에 관련된 사용법을 정리할 필요가 있어서 작성한다.

ORM(Object Relational Mapping) 라이브러리인 SQLAlchemy

객체 지향 프로그래밍과 관계형 데이터베이스의 데이터를 맵핑하기 위해서 사용된다. 특히 filter 메서드는 ORM을 사용할 때 where 절처럼 쿼리문의 조건문을 작성해줄 때 사용해준다.

모델클래스.query.filter() 형태로 사용되며 filter 메서드까지만 사용해주면 쿼리문의 결과가 나올 것이라는 예상과 달리 쿼리문 자체로 콘솔에 보이게 된다. 비슷한 용법으로 filter_by 도 있지만 사용법이 조금 상이하고 제한적이라 대표적으로 filter만 정리한다.

 

기본 사용법

Select * from 테이블명 where 조건
-> Model.query.filter(조건)

 

비교 연산

Model.query.filter(Model.id == id)
Model.query.filter(Model.id != id)

 

그외에도 범위가 지정된 정수값이라면 >, <, <=, >= 도 사용해줄 수 있다.

 

논리 연산

And

Select * from 테이블명 where 조건1 and 조건2
-> Model.query.filter(조건1, 조건2)

Or

Select * from 테이블명 where 조건1 or 조건2
-> Model.query.filter((조건1) | (조건2))
-> Model.query.filter(or_((조건1),(조건2)))

| 연산자나 or_() 함수를 사용해준다.

 

like

기존의 SQL문에서 사용하던 용법대로 사용해줄 수 있다.

Model.query.filter(Model.name.like('Kim%'))

 

not

Model.query.filter(~Model.name.like('Kim%'))

Model.query.filter(not_(Model.name.like('Kim%')))

~ 연산자를 사용하거나 not_() 함수를 사용해준다.

 

In

Model.query.filter(Model.name.in_([val1, val2]))

in_ 메서드에 확인해줄 값을 배열로 넣어서 표현해준다. not in 의 경우 ~를 붙여주면 된다.

 

is not null / is null

Model.query.filter(Model.name.is_(None))

Model.query.filter(Model.name.isnot(None))

 

None을 파라미터에 넣어서 is null, is not null 을 표현해줄 수 있다.

 

위에 적었다시피 filter 메서드를 사용해주면 쿼리문이 리턴되고 이 쿼리문을 실행하고 결과를 가져오기 위해선 first(), one(), all() 등의 메서드가 필요하다.

first()

결과가 하나일 때 사용하나 결과가 여러 개라면 첫 번째 결과를 반환한다. 결과가 없다면 None을 반환한다.

one()

쿼리의 결과가 정확히 하나일 때 사용해준다. 결과가 하나가 아니라면 아래같은 에러가 발생한다.

all()

모든 쿼리 결과를 리스트 형태로 반환한다.

 

'Python > Flask' 카테고리의 다른 글

Flask-session 으로 서버에서 세션 관리  (0) 2024.03.09
Flask + PostgreSQL + React - 2  (1) 2024.03.06
Flask + PostgreSQL + React - 1  (0) 2024.03.05
Jinja2 and Werkzeug?  (0) 2024.03.04
flask 웹개발 기초 정리 - 3 (feat. SQLAlchemy)  (1) 2024.02.28