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()

blank

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๊ฐœ์˜ ์ค‘๊ด„ํ˜ธ.

black2

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)