• 카테고리

    질문 & 답변
  • 세부 분야

    데이터베이스

  • 해결 여부

    미해결

크롤링 결과를 DB에 저장하는 단계에서 PRIMARY KEY로 인해 중복되는 상품이 누락되는 문제

19.09.25 00:02 작성 조회수 204

0

크롤링한 데이터를 db에 저장하면서 PRIMARY KEY 를 item_code 로 정할시 모든 데이터가 추출되지는 않는 것 같습니다.

sql = """SELECT COUNT(*) FROM items WHERE item_code = '""" + item_info['item_code'] + """';"""

위 구문때문에 pk  중복되는 에러는 발생하진 않지만,

특정 상품이 메인과 서브카테고리에 중복되게 존재하는 경우에는 데이터가 누락되네요

물론 학습하는데는 큰 상관은 없습니다만....

실제 현업에서 이런문제가 발생하면 어떻게 해결하시는지 궁금합니다.

제 생각에는 테이블을 다시 정의해야 할것 같은데 

"id INT NOT NULL AUTO_INCREMENT PRIMARY KEY" 이런식으로 해도 될거같긴 하지만

현업에서는 이런 경우에는 PRIMARY KEY를 어떤식으로 정하시나요?

P.S. 좋은 강의 항상 감사합니다.

답변 1

답변을 작성해보세요.

1

안녕하세요. 강의에 첨부된 mysql_advance_with_pymysql.zip 파일의 mysql_advance_with_pymysql.py 파일을 보시면,

다음과 같이 items에 동일 item_code가 있을 경우에는 items에는 해당 상품 정보를 넣지 않지만,

ranking  테이블에는 items에 해당 item_code가 있던 없던, 해당 item_code를 기반으로 메인/서브 카테고리 모두 랭킹을 기록하고 있습니다.

그래서 말씀하신 문제가 생기지 않도록 해놓았습니다.

테이블을 두개로 나누면서,

ranking 테이블에서는 메인/서브 카테코리 랭킹 정보를 모두 기록하고, 사용되는 item에 대해서는 해당 item을 식별할 수 있는 item_code만을 기재해놓고,

items 테이블에서는 메인/서브 카테고리 랭킹에서 사용되는 item을 중복되지 않게만 저장합니다.

그래서 ranking 정보는 결과적으로 ranking 테이블만 확인해보면 누락없이 모두 알 수 있습니다.

도움이 되셨는지 모르겠습니다. 감사합니다.~

---------

def save_data(item_info):

    sql = """SELECT COUNT(*) FROM items WHERE item_code = '""" + item_info['item_code'] + """';"""

    cursor.execute(sql)

    result = cursor.fetchone()

    if result[0] == 0:

        sql = """INSERT INTO items VALUES('""" + item_info['item_code'] + """',

        '""" + item_info['title'] + """', 

        """ + str(item_info['ori_price']) + """, 

        """ + str(item_info['dis_price']) + """, 

        """ + str(item_info['discount_percent']) + """, 

        '""" + item_info['provider'] + """')"""

        cursor.execute(sql)

---> 이 부분은 if 구문 바깥쪽에 기재해놓았기 때문에, if 구문으로 item이 중복되든, 안되는 무조건 실행되도록 해놓았습니다.

    sql = """INSERT INTO ranking (main_category, sub_category, item_ranking, item_code) VALUES('""" + item_info[

        'category_name'] + """',

    '""" + item_info['sub_category_name'] + """', 

    '""" + str(item_info['ranking']) + """', 

    '""" + item_info['item_code'] + """')"""

    cursor.execute(sql)