DB : Insert & Update data - helloMinji/chatbot_spotify GitHub Wiki
1. Insert: ํ๋์ฉ ์ง์ ๋ฃ๋๋ค. (hard coding)
header ์ค์ ํ์ data insert ๋ถ๋ถ์ ์์ฑํ๋ค.
query = "INSERT INTO artist_genres (artist_id, genre, updated_at) VALUES ('{0}', '{1}', NOW())".format('1234', 'hip-hop')
cursor.execute(query)
conn.commit()
2. Insert & Update: Duplicate Record handling ํฌํจ
search API๋ก r ๊ฐ์ ๊ฐ์ ธ์จ ํ์ ํด๋น ๋ถ๋ถ์ ์์ฑํ๋ค.
์ค๋ณต๋ ๊ฐ์ด ์๋ค๋ฉด insert๊ฐ ์๋ update๋ฅผ ์งํํด์ผ ํ๋ค.
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ํ ์ ์๊ฒ ํํ ๋ณ๊ฒฝ
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']
}
)
- if๋ฌธ์์ ์ฐ๋ฆฌ๊ฐ ๊ฒ์ํ๋ ค๊ณ ํ string(q)๊ณผ ๋์ผํ ๋ฐ์ดํฐ(name)๊ฐ ์๋์ง ํ์ธ
- update : artist dict์ value๋ฅผ API๋ก ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ก update
Insert 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()
format ์์ 12๊ฐ์ ๊ฐ์ด ๋ค์ด๊ฐ๋๋ฐ ๋ค์๊ณผ ๊ฐ๋ค.
- ์์ 6๊ฐ์ ๊ฐ: insertํ๊ณ ์ ํ๋ ๊ฐ. ์์ 6๊ฐ์ ์ค๊ดํธ.
- ๋ค์ 6๊ฐ์ ๊ฐ: ์ด๋ฏธ db์ ์ค๋ณต๋ ๊ฐ์ด ์๋์ง ํ์ธํ๊ธฐ ์ํ ๊ฐ. ๋ค์ 6๊ฐ์ ์ค๊ดํธ.
2.1 ๋จ์ํ
Insert DB ๋ถ๋ถ์ ๋จ์ํํ์.
- ์ปฌ๋ผ๋ช ์ ๋ชจ๋ฅผ ์ ์๋ค (ex. id, name)
- ํ๋์ ์ฟผ๋ฆฌ์ ๋๋ฌด ๋ง์ ๋ฐ์ดํฐ๋ฅผ ์์ฑํด์ผ ํ๋ค
ํด๋น ์์น์ ์๋ก ๋ค์ด๊ฐ ์ฝ๋
insert_row(cursor, artist, 'artists')
ํจ์ : cursor์ data๋ฅผ ๊ฐ์ ธ์์ table์ ์ ๋ฐ์ดํธ
def insert_row(cursor, data, table):
- '%s'๊ฐ len(data)๊ฐ ๋งํผ ์๊ธด๋ค
placeholders = ', '.join(['%s'] * len(data))
- table์ columns์ key๊ฐ์ด ๋์ผํ๋ฏ๋ก ๊ทธ๋๋ก ๊ฐ์ ธ์จ๋ค
columns = ', '.join(data.keys())
- key์ placeholders๋ฅผ ํ๋์ string์ผ๋ก ํฉ์น๋ค
key_placeholders = ', '.join(['{0}=%s'.format(k) for k in data.keys()])
- Duplicate Record handling : ์ด๋ฏธ ์๋ key๋ผ๋ฉด update, ์๋๋ฉด insert
sql = "INSERT INTO %s ( %s ) VALUES ( %s ) ON DUPLICATE KEY UPDATE %s" % (table, columns, placeholders, key_placeholders)
- VALUES์ UPDATE ๋ค์ %s์ ๋ค์ด๊ฐ ์ค์ ๊ฐ. ๊ฐ์ ๊ฐ 2๊ฐ ํ์ํ๋ *2
cursor.execute(sql, list(data.values())*2)