코드로 우주평화

SQLAlchemy _ add() 와 add_all() 사용법과 차이점 본문

나는 이렇게 학습한다/Library

SQLAlchemy _ add() 와 add_all() 사용법과 차이점

daco2020 2022. 5. 2. 19:39
반응형

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을 사용하시기 바랍니다.

 

 

 

 

 

반응형