챗봇 학습툴 만들기
MySQL
- 오픈소스 관계형 데이터베이스 관리 시스템
- 파이썬을 포함한 다양한 언어에서 사용할 수 있도록 API 지원
파이썬으로 데이터베이스 연동하기
- 파이썬에서 MySQL 사용하기 위해서는
MySQL 클라이언트 라이브러리
를 사용 - 고수준 API를 지원하며 무료로 사용할 수 있는
PyMySQL
모듈이 공개되어 있음
명령어 | 설명 |
---|---|
SELECT | 데이터 조회 |
INSERT | 데이터 삽입 |
UPDATE | 데이터 변경 |
DELETE | 데이터 삭제 |
1
import pymysql
데이터베이스 연결
host
: 데이터베이스 서버가 존재하는 호스트 주소user
: 데이터베이스 로그인 유저passwd
: 데이터베이스 로그인 패스워드db
: 데이터베이스명charset
: 데이터베이스에서 사용할 charset 인코딩
1
2
3
4
5
6
7
8
db = pymysql.connect(
user='root',
passwd='******',
host='127.0.0.1',
port=3306,
db='database name',
charset='utf8'
)
데이터베이스 사용이 종료된 이후 반드시 DB 연결을 닫아야 함
1
db.close()
데이터 조작
- 테이블 생성, 데이터 삽입, 조회, 변경, 삭제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 테이블 생성
import pymysql
db = None
try:
# DB 호스트 정보 입력
db = pymysql.connect(
user='root',
passwd='******',
host='127.0.0.1',
port=3306,
db='database name',
charset='utf8'
)
# 테이블 생성 SQL 정의
sql = '''
CREATE TABLE tb_student(
id int primary key auto_increment not null,
name varchar(32),
age int,
address varchar(32)
)
'''
# 테이블 생성
with db.cursor() as cursor:
cursor.execute(sql)
# DB 연결 실패시 오류 내용 출력
except Exception as e:
print(e)
# DB 연결된 경우에만 접속 닫기 시도
finally:
if db is not None:
db.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 데이터 삽입
import pymysql
db = None
try:
# DB 호스트 정보 입력
db = pymysql.connect(
user='root',
passwd='******',
host='127.0.0.1',
port=3306,
db='database name',
charset='utf8'
)
# 데이터 삽입 SQL 정의
sql = '''
INSERT tb_student(name, age, address) VALUES('Kei', 35, 'Korea')
'''
# 데이터 삽입
with db.cursor() as cursor:
cursor.execute(sql)
db.commit()
except Exception as e:
print(e)
finally:
if db is not None:
db.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 데이터 변경
import pymysql
db = None
try:
# DB 호스트 정보 입력
db = pymysql.connect(
user='root',
passwd='******',
host='127.0.0.1',
port=3306,
db='database name',
charset='utf8'
)
# 데이터 수정 SQL 정의
id = 1
sql = '''
UPDATE tb_student SET name='케이', age=36 WHERE id=%d
''' % id
# 데이터 수정
with db.cursor() as cursor:
cursor.execute(sql)
db.commit()
except Exception as e:
print(e)
finally:
if db is not None:
db.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 데이터 삭제
import pymysql
db = None
try:
# DB 호스트 정보 입력
db = pymysql.connect(
user='root',
passwd='******',
host='127.0.0.1',
port=3306,
db='database name',
charset='utf8'
)
# 데이터 수정 SQL 정의
id = 1
sql = '''
DELETE FROM tb_student WHERE id=%d
''' % id
# 데이터 수정
with db.cursor() as cursor:
cursor.execute(sql)
db.commit()
except Exception as e:
print(e)
finally:
if db is not None:
db.close()
- 다수의 데이터를 임의로 DB에 삽입해 데이터를 조회
1
2
3
4
5
6
7
8
9
10
11
12
import pymysql
import pandas as pd
# DB 호스트 정보 입력
db = pymysql.connect(
user='root',
passwd='******',
host='127.0.0.1',
port=3306,
db='database name',
charset='utf8'
)
1
2
3
4
5
6
7
8
# 데이터 DB에 추가
students = [
{'name':'Kei', 'age':36, 'address':'PUSAN'},
{'name':'Tony', 'age':34, 'address':'PUSAN'},
{'name':'Jaeyoo', 'age':39, 'address':'GWANGJU'},
{'name':'Grace', 'age':28, 'address':'SEOUL'},
{'name':'Jenny', 'age':27, 'address':'SEOUL'}
]
1
2
3
4
5
6
7
for s in students:
with db.cursor() as cursor:
sql = '''
INSERT tb_student(name, age, address) VALUES('%s', %d, '%s')
''' % (s['name'], s['age'], s['address'])
cursor.execute(sql)
db.commit()
1
2
3
4
5
6
7
8
9
10
# 30대 학생만 조회
cond_age = 30
with db.cursor(pymysql.cursors.DictCursor) as cursor:
sql = '''
SELECT * FROM tb_student WHERE age > %d
''' % cond_age
cursor.execute(sql)
results = cursor.fetchall()
print(results)
1
[{'id': 1, 'name': 'Kei', 'age': 36, 'address': 'PUSAN'}, {'id': 2, 'name': 'Tony', 'age': 34, 'address': 'PUSAN'}, {'id': 3, 'name': 'Jaeyoo', 'age': 39, 'address': 'GWANGJU'}]
1
2
3
# pandas 데이터 프레임으로 표현
df = pd.DataFrame(results)
print(df)
1
2
3
4
id name age address
0 1 Kei 36 PUSAN
1 2 Tony 34 PUSAN
2 3 Jaeyoo 39 GWANGJU
1
2
3
4
5
6
7
8
9
10
# 이름 검색
cond_name = 'Grace'
with db.cursor(pymysql.cursors.DictCursor) as cursor:
sql = '''
SELECT * FROM tb_student WHERE name='%s'
''' % cond_name
cursor.execute(sql)
result = cursor.fetchone()
print(result['name'], result['age'])
1
Grace 28