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 |