플라스크

SQLAlchemy를 이용한 데이터 조작

코드 죄수 2023. 4. 16. 23:51

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()