SQLAlchemy를 이용한 데이터 조작
SQLAlchemy를 사용하여 SQL을 실행하는 방법은 크게 query filter를 이용하는 경우와 executer를 이용하는 경우가 있다.
- query filter: 주로 검색 조건을 좁히거나 정렬하기 위해 사용한다.
- executer: SQL을 실행하고 결과를 취득하기 위해 사용한다.
▼ 예시
User.query
.filter_by(id=2, username="admin") # query filter
.all() # executer
▼SQLAlchemy의 query filter
함수 | 설명 |
filter() | 조건에 맞는 값을 모두 가져온다. |
filter_by() | WHERE구. 레코드를 가져올 조건을 지정한다. |
limit() | LIMIT구. 가져올 레코드의 개수와 상한을 지정한다. |
offset() | OFFSET구. 레코드를 가져올 행의 시작 위치를 지정한다. |
order_by() | ORDER BY구. 레코드를 정렬한다. |
group_by() | GROUP BY구. 레코드를 그룹화 한다. |
▼SQLAlchemy의 executer
메서드 | 설명 |
all() | 모든 레코드를 가져온다. |
first() | 1번째 레코드를가져온다. |
first_or_404() | 1번째 레코드를 가져오거나 없으면 404오류를 반환한다. |
get() | 기본기(primary key)를 지정하여 레코드를 가져온다. |
get_or_404() | 기본키를 지정하여 레코드를 가져오지 않으면 404오류를 반환한다. |
count() | 레코드의 개수를 가져온다. |
paginate() | 페이징으로 레코드를 취득한다. |
SQL을 실행하려면 session(session.query)를 이용한다.
session은 SQLALchemy1.4에서 Deprecated(비추천)가 되고, 새로운 기법이 추가될 예정입니다.
단, Deprecated가 된 후에도 계속 이용할 수 있습니다.
https://docs.sqlalchemy.org/en/14/orm/tutorial.html
Object Relational Tutorial (1.x API) — SQLAlchemy 1.4 Documentation
A Query object is created using the query() method on Session. This function takes a variable number of arguments, which can be any combination of classes and class-instrumented descriptors. Below, we indicate a Query which loads User instances. When evalu
docs.sqlalchemy.org
사용예시
session.query말고 모델객체를 이용하는 방법이 있다.
User.query.all()
# db.session.query(User).all()과 같다.
데이터 1건만 가져오기
db.session.query(User).first()
기본키가 2인 레코드 가져오기
db.session.query(User).get(2)
레코드 개수 가져오기
db.session.query(User).count()
한 페이지에 10건을 표시하고 두 번째 페이지 표시하기
db.session.query(User).paginate(2, 10, False)
# paginate의 인수는 다음과 같다
# paginate( page=None, per_page=None, error_out=True, max_per_page=None)
id가 2이고 username이 admin인 레코드 가져오기
# filter_by
db.session.query(User).filter_by(id=2, username="admin").all()
# filter
db.session.query(User).filter(User.id==2, User.username="admin").all()
가져올 레코드의 개수를 1건으로 지정하기
db.session.query(User).limit(1).all()
3번째의 레코드로부터 1건 가져오기
db.session.query(User).limit(1).offset(2).all()
username을 정렬
db.session.query(User).order_by("username").all()
username을 그룹화
db.session.query(User).group_by("username").all()
INSERT
user = User(
username="사용자명"
email="youremail@example.com"
password="비밀번호"
)
# 사용자를 추가
db.session.add(user)
# 커밋 (커밋하지 않으면 변경이 반영되지 않는다.)
db.session.commit()
UPDATE
user = db.session.query(User).filter_by(id=1).first()
user.username = "사용자명2"
user.email = "youremail2@example.com"
user.password = "비밀번호2"
db.session.add(user)
db.session.commit()
DELETE
user = db.session.query(User).filter_by(id=1).delete()
db.session.commit()