본문 바로가기

Data Science : Study/2. Data Engineering (FastCampus)

4강-6. DB에 데이터 넣기 (Python, Insert, Update)

반응형

썸네일

 

 

 

! 목표
- API로 가져온 데이터를 DB에 INSERT
- 중복 데이터가 INSERT되지 않도록 한다
- 데이터를 정확히 몰라도 INSERT되도록 한다

 

1. Hard coding : 하나씩 INSERT

header 설정 후에 data INSERT 부분을 작성한다. (https://hellominji.tistory.com/54)

 

3강-3. Python API 토큰 가져오기 (Spotify)

썸네일 * Spotify API에 대한 상세한 설명은 url 참고할 것! https://developer.spotify.com/documentation/general/guides/authorization-guide/#client-credentials-flow ! 목표 API 사용을 위한 access token..

hellominji.tistory.com

query = "INSERT INTO artist_genres (artist_id, genre, updated_at) VALUES ('{0}', '{1}', NOW())".format('1234', 'hip-hop')
    cursor.execute(query)
    conn.commit()

 

 

 

2. API로 가져온 값을 INSERT

search API로 r값을 가져온 후에 작성한다. (https://hellominji.tistory.com/55)

 

3강-3. Python API 토큰 가져오기 (Spotify)

썸네일 * Spotify API에 대한 상세한 설명은 url 참고할 것! https://developer.spotify.com/documentation/general/guides/authorization-guide/#client-credentials-flow ! 목표 API 사용을 위한 access token..

hellominji.tistory.com

API 사용
    r = requests.get("https://api.spotify.com/v1/search", params=params, headers=headers)
    raw = json.loads(r.text)
데이터 확인

- 타입 확인 : print(type(raw))

- 어떤 정보가 있는지 확인 : print(raw['artists']['items'][0].keys())

API 결과를 INSERT할 수 있게 형태 변경
- if문에서 우리가 검색하려고 한 string(q)과 동일한 데이터(name)가 있는지 확인
- update : artist dict의 value를 API로 가져온 데이터로 update
    artist = {}

    artist_raw = raw['artists']['items'][0]
    
    if artist_raw['name'] == params['q']:

        artist.update(
            {
                'id': artist_raw['id'],
                'name': artist_raw['name'],
                'followers': artist_raw['followers']['total'],
                'popularity': artist_raw['popularity'],
                'url': artist_raw['external_urls']['spotify'],
                'image_url': artist_raw['images'][0]['url']
            }
        )
INSERT
- 앞의 6개 값 : VALUES 부분. INSERT하고자 하는 값.
- 뒤의 6개 값 : DUPLICATE KEY 부분. 이미 DB에 중복된 값이 있는지 확인하기 위한 값.
    query = """
        INSERT INTO artists (id, name, followers, popularity, url, image_url)
        VALUES ('{}', '{}', {}, {}, '{}', '{}')
        ON DUPLICATE KEY UPDATE id='{}', name='{}', followers={}, popularity={}, url='{}', image_url='{}'
    """.format(
            artist['id'],
            artist['name'],
            artist['followers'],
            artist['popularity'],
            artist['url'],
            artist['image_url'],
            artist['id'],
            artist['name'],
            artist['followers'],
            artist['popularity'],
            artist['url'],
            artist['image_url']
    )
    cursor.execute(query)
    conn.commit()

 

 

 

3. 좀 더 쉽게 INSERT 하고 싶다! (단순화)

해당 위치에 새로 들어갈 코드

insert_row(cursor, artist, 'artists')

함수 생성 : cursor와 dadta를 가져와서 table 업데이트

def insert_row(cursor, data, table):
    placeholders = ', '.join(['%s']*len(data))
    columns = ', '.join(data.keys())
    key_placeholders = ', '.join(['{0}=%s'.format(k) for k in data.keys()])
    sql = "INSERT INTO %s ( %s ) VALUES ( %s ) ON DUPLICATE KEY UPDATE %s" % (table, columns, placeholders, key_placeholders)
    cursor.execute(sql, list(data.values())*2)

- placeholders : %s가 len(data)만큼 생긴다 = sql 부분 짧아진다

- columns : 앞의 6개 값과 동일한 내용이라서 data.keys()로 가져온다 = sql 부분 짧아진다

- key_placeholders : 원래 UPDATE 뒷부분이 긴데 해당 내용이 좀 짧아진다

 

 

 

4. %와 .format()

함수 내용을 보면 두 가지 모두 쓰이고 있다.(key_placeholders, sql)

- % : value를 변수로 지정한다 ex. table, columns, placeholders, ...

- .format : 대괄호 안에 숫자를 써서 순서지정 가능 ex. {1},{0} 하면 순서 변경해서 string 생성

 

 

 

 

 

이런 내용이 더 있으면 좋겠다, 이건 뭐라는지 모르겠다, 그 외의 어떤 얘기든 댓글로 남겨주세요!

 

 

 

반응형