python - db cursor의 lastrowid 이용해서 참조 테이블 생성하기

jomminii_before·2020년 4월 12일
1

Database-series

목록 보기
6/6

(배경설명)
현재 브랜디 셀러 어드민 클론 프로젝트를 진행중이며, 파이썬(플라스크)을 이용해 백엔드 부분을 작성 중

프로젝트 중 아래와 같이 셀러정보 테이블을 생성할 때, 연관된 담당자 정보 테이블을 동시에 생성해야할 경우가 있었습니다. 새로 생성되는 담당자 정보 테이블은 무조건 자신이 참조하고 있는 셀러정보의 아이디 값을 알아내서 그 값을 적용해 테이블을 생성해야 합니다.

그러려면 담당자정보 테이블을 생성하기 전에 생성된 셀러정보 테이블의 아이디 값을 알아내야하는데요, 이 둘을 분리해서 단순히 바로 전에 생성된 셀러정보의 아이디 값을 찾아내는 코드를 작성하는 방법으로는 안됩니다. 만약 동시에 셀러정보를 생성하려는 시도가 여러번 발생하게 되면 참조하려는 정보가 아닌 다른 정보를 참조하게 될 수도 있거든요

이를 막기 위해 db_cursor가 제공하는 lastrowid 를 이용합니다. lastrowiddb_cursor를 이용해 excute한 테이블의 마지막 행 id 값을 가져와주는데, 자기 자신(cursor)이 건든 값만 가져오므로 셀러정보를 동시에 만드려는 시도가 있어도 영향을 받지 않습니다.

코드는 아래와 같이 작성할 수 있습니다.

                # 셀러 기본 정보 생성
                # seller_infos 테이블 INSERT INTO
                insert_seller_info_statement = """
                    INSERT INTO seller_infos (
                    seller_account_id,
                    profile_image_url,
                    seller_status_id,
                    seller_type_id,
                    product_sort_id,                 
                    name_kr,
                    name_en
                ) VALUES (
                    %(seller_account_id)s,
                    %(profile_image_url)s,
                    %(seller_status_no)s,
                    %(seller_type_no)s,
                    (SELECT product_sort_id FROM seller_types WHERE seller_type_no = %(seller_type_no)s),                     
                    %(name_kr)s,
                    %(name_en)s
                )"""

                # 셀러 기본정보 insert 함
                db_cursor.execute(insert_seller_info_statement, account_info)

                # 위에서 생성된 새로운 셀러정보의 id 값을 가져옴
                seller_info_no = db_cursor.lastrowid

                # manager_infos 테이블 INSERT INTO
                insert_manager_info_statement = """
                    INSERT INTO manager_infos (
                    name,
                    contact_number,
                    email,
                    ranking,
                    seller_info_id
                ) VALUES (
                    %(name)s,
                    %(contact_number)s,
                    %(email)s,
                    %(ranking)s,
                    %(seller_info_id)s
                )"""

                # for 문을 돌면서 담당자 정보를 insert 함
                for i in range(len(manager_infos)):
                    manager_info_data = {
                        'name': manager_infos[i]['name'],
                        'contact_number': manager_infos[i]['contact_number'],
                        'email': manager_infos[i]['email'],
                        'ranking': manager_infos[i]['ranking'],
                        'seller_info_id': seller_info_no
                    }

                    db_cursor.execute(insert_manager_info_statement, manager_info_data)
profile
https://velog.io/@jomminii 로 이동했습니다.

0개의 댓글