10. 데이터베이스
파이썬을 이용한 머신러닝, 딥러닝 실전개발 입문
파이썬을 이용한 머신러닝, 딥러닝 실전개발 입문 책과 강의를 바탕으로한 코드 리뷰 및 정리입니다. 자세한 내용은 책과 강의를 참고해주세요.
link: github
3. 데이터 소스의 서식과 가공
3-2. 데이터 베이스
데이터베이스
축적한 데이터를 공유하거나, 동시에 접근하게 되는 경우가 있다면 데이터 베이스를 사용하는 것이 좋다. 또한 머신러닝을 사용할 경우 데이터 파일을 여러 프로그램에서 사용하기 때문에 데이터 베이스를 사용하는 것이 좋다. 웹에서 수집한 데이터인 경우 데이터베이스를 사용해 중복 데이터를 저장하지 않게 제약을 걸면 좋다.
- 장점
- 데이터와 관련된 모든 처리를 하나의 소프트 웨어로
- 여러 데이터의 속성을 연관시키며 저장 가능
- 중복된 데이터를 허용하지 않는 등 제약을 걸 수 있음
- 데이터의 정합성 확보
- 데이터의 공유 용이
- 동시 접근했을 때의 문제 해결
- 대량의 데이터를 조금씩 읽어 사용할 수 있음. 정렬도 쉬움
데이터베이스의 종류
- MySQL/ MariaDB
- PostgreSQL
- MongoDB(NoSQL)
- TinyDB(NoSQL)
- Microsoft SQL Server (상용)
- Oracle Database (상용)
- SQLite
등이 있다. 이들을 크게 관계형 데이터베이스 관리 시스템(RDBMS)와 NoSQL로 나눌 수 있다.
RDBMS는 많은 데이터베이스들에 사용되는 시스템. 데이터 조작언어로 SQL을 사용한다. 테이블을 만들 때 CREATE TABLE로 스키마를 정의해야한다. 반면 NoSQL은 문서형 데이트베이스로 스키마를 정의하지 않아도 되서 굉장히 간단하게 사용할 수 있다.
이들 중 오픈소스로 널리 사용되는 RDBMS로 MySQL/MariaDB, SQLite 과 NoSQL로 TinyDB에 대해 아래에서 살펴보자.
SQLite - 가볍게 파일 하나로 사용할 수 있는 데이터 베이스
가볍고 SQL을 사용해 데이터베이스를 처리할 수 있다는 것이 널리 사용되는 이유다. 파일 하나가 하나의 DB며 별도의 DB전용 어플리케이션이 필요 없고 파이썬에서 sqlite3 라이브러리를 선언하기만 하면 사용할 수 있다.
#test.sqlite파일 DB에 사과, 오렌지, 바나나의 이름과 가격을 넣고 추출
import sqlite3
#sqlite 데이터베이스 연결하기
dbpath="test.sqlite"
conn=sqlite3.connect(dbpath)
#테이블을 생성하고 데이터 넣기
cur=conn.cursor() #데이터베이스 조작커서 추출
cur.executescript("""
/*items 테이블이 이미 있다면 제거하기*/
DROP TABLE IF EXISTS items;
/*테이블 생성하기*/
CREATE TABLE items(
item_id INTEGER PRIMARY KEY,
name TEXT UNIQUE,
price INTEGER
);
/*데이터 넣기*/
INSERT INTO items(name, price)VALUES('Apple',800);
INSERT INTO items(name, price)VALUES('Orange',780);
INSERT INTO items(name, price)VALUES('Banana',430);
""")
#위의 조작을 데이터베이스에 반영
conn.commit()
#데이터 추출하기
cur=conn.cursor()
cur.execute("SELECT item_id, name, price FROM items") #SQL 한 문장 일 때 cur.execute()로 실행가능
item_list=cur.fetchall() # 결과를 전부 추출 가능 / 한개씩 추출하고 싶을때는 cur.fetchone()
#출력하기
for item in item_list:
print(item)
DROP TABLE IF EXISTS items
부분에서 처음에 오류가 날 수 있는데 이는 처음 실행할 당시에는 items 테이블이 만들어져 있는 상태가 아니기 때문이다. 따라서 주석처리한 후 처음 실행하고 그 다음에 다시 이 부분의 코드를 넣어 돌리면 오류없이 실행할 수 있다. 우리가 코드를 여러번 실행할 수 있기 때문에 넣어놓은 코드이다.
MYSQL
오픈소스 데이터베이스로 빠르고 사용하기 쉬우며 다양한 웹 애플리케이션의 대규모 데이터 저장에 사용되고 있다. 서버에 설치해 사용하는 애플리케이션이다. 파이썬을 이용해 쉽게 데이터베이스에 접근하고 활용할 수 있다.
서버에 설치하는거라 일반적으로 Docker위에 설치하는데, 실습용이고 Mac os를 사용하니 그냥 바로 설치해 보기로 했다. 설치는 잘 정리해 주신 zzsza님의 포스팅 을 참고했다.
$brew install mysql
$mysql.server start
$mysql_secure_installation
(root password 설정)
$brew services start mysql
$mysql -u root p
(password 입력)
mysql> CREATE DATABASE test;
의 과정을 통해 test db를 생성한 후 위의 예제와 비슷한 코드를 입력해 보았다.
import MySQLdb
conn=MySQLdb.connect(
user='root',
passwd='Young8276!',
host='localhost',
db='test'
)
cur=conn.cursor()
cur.execute('DROP TABLE items')
cur.execute("""
CREATE TABLE items(
item_id INTEGER PRIMARY KEY AUTO_INCREMENT,
name TEXT,
price INTEGER)
""")
data=[('Banana',300),('Mango',640),('kiwi', 280)]
for dat in data:
cur.execute("INSERT INTO items (name, price) VALUES(%s,%s)",dat)
cur.execute("SELECT * FROM items")
for row in cur.fetchall():
print(row)
마찬가지로 cur.execute('DROP TABLE items')
에서 처음 실행 시 오류가 날 수 있다. 위와 같은 방법으로 처음 돌릴 때 주석처리를 해주었다가 그다음에 다시 주석을 해제하면 해결된다.
TinyDB
NoSQL. 간단하게 pip 설치후 이용할 수 있다.
데
$pip3 install tinydb
from tinydb import TinyDB, Query
#데이터베이스 연결하기
filepath="test-tynydb.json"
db=TinyDB(filepath)
#기존의 테이블이 있다면 제거
db.purge_table('fruits')
#테이블 생성/추출
table=db.table('fruits')
#테이블에 데이터 추가하기
table.insert({'name':'Banana', 'price':6000})
table.insert({'name':'Orange','price':12000})
table.insert({'name':'Mango','price':8400})
#모든 데이터 추출해서 출력
print(table.all())
#특정 데이터 추출 (Orange 검색)
Item=Query()
res=table.search(Item.name=='Orange')
print('Orange is', res[0]['price'])
#가격이 8000원 이상인 것 추출
print("8000원 이상 : ")
res=table.search(Item.price>=8000)
for it in res:
print(it['name']," ")
데이터베이스는 JSON형식의 데이터이며 삽입하는 데이터는 딕셔너리(dict), 검색 결과는 리스트(list)로 반환한다.
가벼운 체험으로 TinyDB를 실습해 보았으나 데이터 규모가 커지면 MongoDB를 사용하는 것이 좋다.