(배경설명)
현재 브랜디 셀러 어드민 클론 프로젝트를 진행중이며, 파이썬(플라스크)을 이용해 백엔드 부분을 작성 중
프로젝트 중 아래와 같이 셀러정보 테이블을 생성할 때, 연관된 담당자 정보 테이블을 동시에 생성해야할 경우가 있었습니다. 새로 생성되는 담당자 정보 테이블은 무조건
자신이 참조하고 있는 셀러정보의 아이디 값을 알아내서 그 값을 적용해 테이블을 생성해야 합니다.
그러려면 담당자정보 테이블을 생성하기 전에 생성된 셀러정보 테이블의 아이디 값을 알아내야하는데요, 이 둘을 분리해서 단순히 바로 전에 생성된 셀러정보의 아이디 값을 찾아내는 코드를 작성하는 방법으로는 안됩니다. 만약 동시에 셀러정보를 생성하려는 시도가 여러번 발생하게 되면 참조하려는 정보가 아닌 다른 정보를 참조하게 될 수도 있거든요
이를 막기 위해 db_cursor
가 제공하는 lastrowid
를 이용합니다. lastrowid
는 db_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)