코드로 우주평화
SQLAlchemy _ add() 와 add_all() 사용법과 차이점 본문
add()와 add_all()
add()와 add_all() 은 sqlalchemy session의 메서드로서 DB에 데이터를 넣을 때 사용합니다.
메서드의 이름에서 보면 알다시피 add는 단일 insert이고 add_all 은 bulk insert입니다.
오늘은 이 둘의 사용법에 대해서 알아보겠습니다.
add()
여기 3개의 이름을 DB에 넣어야 한다고 해봅시다.
3개의 데이터는 각각 첫 번째 요소가 id, 두 번째 요소가 이름입니다.
names = [
[1, "변덕순"],
[2, "장득현"],
[3, "고문용"],
]
이를 add()로 넣는다면 다음과 같은 코드를 작성할 수 있습니다.
('Name'은 model class입니다)
names = [
[1, "변덕순"],
[2, "장득현"],
[3, "고문용"],
]
for name in names:
name_item = Name(
id=name[0],
name=name[1],
)
session.add(name_item)
session.commit()
for 문을 통해 데이터를 개별적으로 insert 할 수 있습니다.
최종 저장을 위해 for문 밖에서 commit을 해줍니다.
add_all()
names = [
[1, "변덕순"],
[2, "장득현"],
[3, "고문용"],
]
session.add_all([Name(id=name[0], name=name[1]) for name in names])
session.commit()
동작원리는 add와 크게 다르지 않으나,
개별적으로 insert 하는 add와 달리 add_all 은 리스트 형태로 한 번에 insert 합니다.
또한 형태만 맞춘다면 add_all 은 단일 insert도 가능합니다.
add_all이 있는데, 굳이 add 가 필요한 이유는?
add_all 은 하나 또는 그 이상의 데이터를 한번에 넣을 수 있습니다.
그렇다면 하나씩 넣을 수 있는 add는 필요가 없을까요?
이 둘의 차이점은 '하나씩 넣느냐', '한 번에 넣느냐'의 차이일 것입니다.
만약 여러 데이터 중에 일부 잘못된 데이터가 있고 해당 데이터는 DB에 저장 할 수 없다고 가정해봅시다.
add_all로 데이터를 넣는 경우,
잘못된 일부 데이터로 인해 최종적으로 모두 롤백되어 어떤 데이터도 들어가지 못할 것입니다.
하지만 add의 경우,
데이터를 하나씩 넣으므로 그 과정에서 잘못된 데이터를 제외시킬 수 있습니다.
다음은 예시 코드입니다.
names = [
[1, "변덕순"],
[2, "장득현"],
["헤헤", "고문용"],
]
for name in names:
if isinstance(name[0], int):
name_item = Name(
id=name[0],
name=name[1],
)
session.add(name_item)
session.commit()
만약 id에 "헤헤"처럼 str 타입이 들어온다면, 해당 데이터를 제외하고 나머지 값들만 insert 할 수 있습니다.
넣으려는 데이터의 일부가 완벽하지 않더라고 insert에 성공할 수 있는 것입니다.
마무리
물론 add_all 또한 사전에 유효성 검사를 마친 데이터를 사용해 데이터를 넣을 수 있을 것입니다.
반대로 데이터가 한 개씩 들어올 경우, 굳이 add_all에 리스트 형태로 데이터를 넣을 필요가 없을 것입니다.
결국 어떤 데이터를, 어떻게 넣을 것이냐에 따라 선택지는 달라질 것입니다.
본인의 목적과 상황에 맞게 add, add_all을 사용하시기 바랍니다.
'나는 이렇게 학습한다 > Library' 카테고리의 다른 글
websockets _ Python 으로 비트코인 실시간 시세 가져오기 (feat. twelvedata) (1) | 2022.07.24 |
---|---|
konlpy _ m1 mac 에서의 JAVA_HOME 경로 문제 (0) | 2022.05.07 |
Pytest _ client 에서 parmas 값 넣는 방법 (0) | 2022.04.27 |
SQLAlchemy 1.x 와 2.0의 Query 스타일 비교 (0) | 2022.04.25 |
SQLAlchemy에서의 비동기 쿼리 (feat. 2.0 Style) (0) | 2022.04.24 |