17 Wed

[HEAD FIRST PYTHON] 7๊ฐ• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉํ•˜๊ธฐ

DB-API

  • ํŒŒ์ด์ฌ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ์ง€์›

    • ์ด ๊ธฐ๋Šฅ์€ MySQL ์ „์šฉ์€ ์•„๋‹˜

  • SQL ๊ธฐ๋ฐ˜ DB๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก DB-API๋ผ๋Š” ํ‘œ์ค€ DB API๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

    • ์ด ๋•Œ ํ•„์š”ํ•œ ๊ฒƒ์€ DB๊ธฐ์ˆ ๊ณผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๋“œ๋ผ์ด๋ฒ„

  • ์ฝ”๋“œ <-> ํŒŒ์ด์ฌ์˜ DB-API <-> MySQL ๋“œ๋ผ์ด๋ฒ„ <-> MySQL

  • ์ฝ”๋“œ๋ฅผ ๋ฐ”๊พธ์ง€ ์•Š์•„๋„ DB ๊ธฐ์ˆ ์„ ์–ธ์ œ๋“ ์ง€ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

MySQL ๋น„๋ฒˆ ์žŠ์–ด๋ฒ„๋ ธ์„ ๋•Œ

๋กœ๊ทธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๊ฒฐ์ •ํ•˜๊ธฐ

mysql> create table log(
    -> id int auto_increment primary key,
    -> ts timestamp default current_timestamp,
    -> phrase varchar(128) not null,
    -> letters varchar(32) not null,
    -> ip varchar(16) not null,
    -> browser_string varchar(256) not null,
    -> results varchar(64) not null );
    
+----------------+--------------+------+-----+-------------------+-------------------+
| Field          | Type         | Null | Key | Default           | Extra             |
+----------------+--------------+------+-----+-------------------+-------------------+
| id             | int          | NO   | PRI | NULL              | auto_increment    |
| ts             | timestamp    | YES  |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
| phrase         | varchar(128) | NO   |     | NULL              |                   |
| letters        | varchar(32)  | NO   |     | NULL              |                   |
| ip             | varchar(16)  | NO   |     | NULL              |                   |
| browser_string | varchar(256) | NO   |     | NULL              |                   |
| results        | varchar(64)  | NO   |     | NULL              |                   |
+----------------+--------------+------+-----+-------------------+-------------------+
7 rows in set (0.06 sec)

DB-API ์ž์„ธํžˆ ๋ณด๊ธฐ

>>> dbconfig = { 'host': '127.0.0.1',
... 'user': 'vsearch',
... 'password': 'vsearchpasswd',
... 'database': 'vsearchlogDB', }
>>> import mysql.connector
>>> conn = mysql.connector.connect(**dbconfig)
>>> cursor=conn.cursor()
  • 1 : MySQL์— ์—ฐ๊ฒฐํ•  ๋•Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ 4๊ฐ€์ง€ ์ •๋ณด๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค.

    • MySQL์„ ์‹คํ–‰ํ•˜๋Š” ์ปดํ“จํ„ฐ์˜ IP ์ฃผ์†Œ/์ด๋ฆ„

    • ์‚ฌ์šฉ์ž ID

    • ์•”ํ˜ธ

    • ์‚ฌ์šฉ์ž ID๋กœ ์ด์šฉํ•˜๋ ค๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ช…

  • 5 : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“œ๋ผ์ด๋ธŒ๋ฅผ import ํ•˜์—ฌ DB-API๋กœ MySQL ์ „์šฉ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    • ์ฐธ๊ณ ๋กœ import๋ฌธ์„ ํ•จ์ˆ˜์•ˆ์— ๋„ฃ๋Š” ์ผ์€ ๊ต‰์žฅํžˆ ์†Œ๋ชจ์ ์ธ ์ผ์ด๋‹ค. ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋งˆ๋‹ค import ํ•˜๊ธฐ ๋•Œ๋ฌธ.

  • 6 : ์ด ํ˜ธ์ถœ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๊ฒฐ. ์ด ๋•Œ ์—ฐ๊ฒฐ ํŠน์„ฑ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

    • ์—ฌ๊ธฐ์„œ ** ์€ ํฌ์ธํ„ฐ๊ฐ€ ์•„๋‹ˆ๋‹ค. ์ดํ›„์— ์„ค๋ช…

  • 7 : ์„œ๋ฒ„๋กœ ๋ช…๋ น์„ ์ „๋‹ฌํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ปค์„œ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

>>> _ SQL = """show tables"""
>>> cursor.execute(_SQL)
>>> res = cursor.fetchall()

>>> _SQL = """describe log"""
>>> cursor.execute(_SQL)
>>> res = cursor.fetchall()
>>> for row in res:
        print(row)
  • 1 : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ๋ณด๋‚ผ SQL ์งˆ์˜๋ฅผ ์‚ผ์ค‘๋”ฐ์˜ดํ‘œ๋กœ ๊ฐ์‹ธ๊ณ  _SQL ๋ณ€์ˆ˜๋กœ ํ• ๋‹นํ•œ๋‹ค. ์งˆ์˜๋Š” ์—ฌ๋Ÿฌ ํ–‰์œผ๋กœ ๊ตฌ์„ฑ๋  ์ผ์ด ๋งŽ๊ณ  ์‚ผ์ค‘ ๋”ฐ์˜ดํ‘œ๋ฅผ ์ด์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ํ–‰์„ ํ‘œํ˜„ํ•˜๊ธฐ ํŽธํ•˜๋‹ค.

  • 2 : _SQL ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ์งˆ์˜๋ฅผ MySQL๋กœ ๋ณด๋‚ด ์‹คํ–‰ํ–ˆ๋‹ค.

  • 3 : cursor.fetchall ๋ฉ”์„œ๋“œ๋กœ ์งˆ์˜์˜ ๋ชจ๋“  ๊ฒฐ๊ณผ๋ฅผ ์š”์ฒญํ•œ๋‹ค.

    • cursor.fetchone : ํ•œ ํ–‰์„ ๋ฐ˜ํ™˜ ์š”์ฒญ

    • cursor.fetchmany : ๋ฐ›์„ ํ–‰์˜ ์ˆ˜๋ฅผ ์ง€์ •

    • cursor.fetchall : ๋ชจ๋“  ๊ฒฐ๊ณผ ํ–‰์„ ๋ฐ˜ํ™˜ ์š”์ฒญ

>>> _SQL = """insert lnto log
                (phrase, letters, ip, browser_string, results)
                values
                ('hitch-hiker', 'aeiou', '127.0.0.1', 'Firefox', "{'e', 'i'}") """
>>> cursor.execute(_SQL)
  • 1 : ํ•˜๋“œ ์ฝ”๋”ฉ ํ•˜์—ฌ insert ๋ฌธ์„ ์‹คํ–‰. ํ…Œ์ด๋ธ”์— ์ €์žฅํ•˜๋Š” ๊ฐ’์ด ๋งค๋ฒˆ ๋ฐ”๋€Œ๋ฏ€๋กœ ํ•˜๋“œ์ฝ”๋”ฉ์€ ์ข‹์ง€ ์•Š์Œ. ๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ

>>> _SQL = """insert lnto log
                (phrase, letters, ip, browser_string, results)
                values
                (%s %s %s %s %s) """
>>> cursor.execute(_SQL, ('hitch-hiker', 'aeiou', '127.0.0.1', 'Firefox', "{'e', 'i'}"))
  • 4 , 5: DB-API ํ”Œ๋ ˆ์ด์Šค ํ™€๋”๋ผ๊ณ  ํ•˜๋ฉฐ, ํ•˜๋“œ์ฝ”๋”ฉ ๋Œ€์‹  ์ธ์žฃ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์žฌํ™œ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค.

>>> conn.commit()
>>> _SQL = """select * from log"""
>>> cursor.execute(_SQL)
>>> for row in cursor.fetchall():
    print(row)
  • 1 : 2๋ฒˆ ํ–‰์—์„œ select๋ฅผ ํ•  ๋•Œ, ์ตœ๊ทผ์— ์ €์žฅ๋œ ๋‚ด์šฉ์ด ๋ถˆ๋Ÿฌ์˜ค์ง€ ์•Š์•„์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด conn.commit() ์„ ํ†ตํ•ด ์บ์‹œ์— ๋‚จ์•„์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฆ‰์‹œ ๊ธฐ๋กํ•˜๋„๋ก ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

    • ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋™์ž‘์€ ๋น„์‹ผ ์—ฐ์‚ฐ(ํ”„๋กœ์„ธ์‹ฑ ์‚ฌ์ดํด ๊ด€์ ์—์„œ) ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์บ์‹œ์— ์ €์žฅํ•˜๋Š” ์ผ์ด ๋‹ค์ˆ˜์ด๋‹ค.

>>> cursor.close()
True
>>> conn.close()
  • 1, 3 : ์—ฐ๊ฒฐ์ด ๋๋‚œ ๋’ค์—๋Š” ๋‹ซ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

Last updated

Was this helpful?