TIL[87].lastrowid를 이용한 테이블 생성

jake.log·2020년 11월 8일
0

이번 브랜디 어드민 프로젝트를 하면서 회원가입 api를 맡았다.

회원가입 api 작업시 controller- service- model 패턴으로 controller에서 유효성 검사, service에서 중복 체크 후 model에서 중복 체크가 완료된 데이터를 각각 dao의 sql 문을 통해 입력하는 순으로 진행했다.

이 과정 중 model을 처리하는 작업에서 def signup_account / def insert_manager_info / def inser_seller_info 를 사용하여 회원 가입시 각 데이터 베이스에 정보를 각각 입력하려고 했다. 그러나 이 과정이 진행이 되기 위해서는 model에서 commit을 일일히 해줘야 하는 점으로 정보가 겹치거나 여러번 중복되어 만들어 지는 문제점이 생길 수도 있다.

그러나 account 정보 테이블을 생성할 때 동시에 seller , manager 2개의 테이블이 들어가야 하는 경우라서 참조하는 id 값이 있을 경우 굳이 sql 문을 나누지 않더라도 한번에 데이터를 입력할 수 있었다.

seller 테이블에 데이터를 입력하기 전 이미 생성된 account 테이블에서 cursor의 lastrowid를 이용해 execute를 한 테이블의 마지막 행 id 값을 가져온다.
manager 테이블 데이터도 마찬가지로 seller테이블의 cursor lastrowid 를 이용하여 id값을 가져와 데이터를 넣어준다.

이렇게 할 경우 cursor가 만든 값만 가져오기 때문에 셀러 정보가 동시에 여러번 만들어지는 것을 막을 수 있다.

다음은 lastrowid를 사용하여 하나의 함수로 id를 forienkey로 가져와 다른 테이블에도 데이터를 입력할 수 있는 코드이다.

  def signup_account(self, seller_info, db_connection):
        with db_connection.cursor(pymysql.cursors.DictCursor) as cursor:
            insert_accounts_query = """
            INSERT INTO accounts(
                identification,
                password,
                account_type_id
            )VALUES(
                %(identification)s,
                %(password)s,
                2
            )
            """
 #SQL문 실행 및 기입
            cursor.execute(insert_accounts_query,seller_info)
            
            account_number = cursor.lastrowid
            seller_info['account_type_id'] = account_number

            print('연결2-1')
            insert_sellers_query = """
            INSERT INTO sellers(
                contact,
                account_id,
                attribute_id,
                status_id,
                korean_name,
                english_name,
                cs_contact,
                updater_id
            ) VALUES (
                %(contact)s,
                (SELECT id FROM accounts WHERE identification=%(identification)s),             
                %(attribute_id)s,
                1,
                %(korean_name)s,    
                %(english_name)s,
                %(cs_contact)s,
                (SELECT accounts.id FROM accounts JOIN sellers AS s ON accounts.id = s.account_id WHERE identification=%(identification)s)
            )
            """ 
            print(seller_info)
            cursor.execute(insert_sellers_query, seller_info)
            print('연결3')

            seller_account_no= cursor.lastrowid
            seller_info['account_id'] = seller_account_no
            print('연결4')
            #담당자 정보 생성 
            insert_managers_query = """
            INSERT INTO managers(
                contact,
                seller_id,
                ordering,
                updater_id
            ) VALUES (
                %(contact)s,
                (SELECT id FROM sellers WHERE contact=%(contact)s),
                1,
                (SELECT id FROM accounts WHERE identification=%(identification)s)
            )
            """
            print(cursor)
            cursor.execute(insert_managers_query, seller_info)
            print("연결4-1")
            return jsonify({"message":"SUCCESS"})

참고 : https://velog.io/@devmin/python-db-cursor-lastrowid

profile
꾸준히!

0개의 댓글