썸네일
! 목표
- API로 가져온 데이터를 DB에 INSERT
- 중복 데이터가 INSERT되지 않도록 한다
- 데이터를 정확히 몰라도 INSERT되도록 한다
1. Hard coding : 하나씩 INSERT
header 설정 후에 data INSERT 부분을 작성한다. (https://hellominji.tistory.com/54)
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)
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 생성
이런 내용이 더 있으면 좋겠다, 이건 뭐라는지 모르겠다, 그 외의 어떤 얘기든 댓글로 남겨주세요!
'Data Science : Study > 2. Data Engineering (FastCampus)' 카테고리의 다른 글
4강-8. Python API batch 형식으로 데이터 가져오기 (0) | 2022.05.18 |
---|---|
4강-7. Python API 파일 형식으로 데이터를 여러번 요청하기 (0) | 2022.05.17 |
4강-5. Python에 mySQL DB 연결 (0) | 2022.05.15 |
4강-4. ERD (엔티티 관계도) (0) | 2022.05.14 |
4강-3. SQL CREATE, ALTER, INSERT, UPDATE, REPLACE (0) | 2022.05.13 |