2015. 6. 22. 11:35ㆍProgramming/python
DB를 사용함에 있어 PK가 있는 경우에는 Update를, PK가 없는 경우에는 Insert를 써야 하는 경우가 많다.
Django에서는 insert_or_update라는 함수를 따로 제공해 줘서 이 API를 이용했던 기억이 있는데, sqlalchemy 같은 경우에는 이러한 기능을 따로 제공하지 않는 것 같다.
찾아본 결과 sql 쿼리를 직접 날려서 insert_or_update를 처리하거나, select를 해서 pk 여부를 확인한 후 insert를 하는 방법 이렇게 두가지 방법을 확인하였으며, 두 번째 방법으로 insert_or_update 구현하기로 하였다.
(사실 oracle처럼 merge란 방법을 쓰란 것도 있었는데, 이건 진짜 도통 모르겠어서 패쓰~)
간략하게 코드 설명을 하자면, 우선 연결되어 있는 db_session에다가 query를 날려서 해당 데이터가 있는지 여부를 판별한다.
여기서 filter_by를 쓴 이유는 날리고자 하는 쿼리 데이터가 pk가 아니라서 하나 이상의 데이터가 리턴될 수 있기 때문에 filter_by란 함수를 사용하였다. 만약 pk를 쿼리로 날리는 것이라면 get을 사용해도 무방하다.
마지막에 first함수는 가져온 여러개 레코드 중 가장 첫번째 것만 리턴하라는 뜻을 가지고 있다.
이렇게 가져온 데이터에 대하여 해당 데이터가 None이라면 새롭게 insert를 해준다.
그 후에 마지막으로 session을 commit하면 insert_or_update 처리 구문이 완료가 된다.