이번 브랜디 어드민 프로젝트를 하면서 회원가입 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"})