7. 정보관리 - 7.2.파이썬으로 DB 사용하기
글을 쓰면서 늘 느끼는 것이지만 어느 분야나 처음 보는 용어는 참 생소하고 어렵다. 더욱이 앞 글자만 따서 축약한 용어(abbreviation)는 배움을 힘들게 만들기도 한다. 앞서 DB를 살펴보고 MariaDB를 다루면서 SQL(Structured Query Language)를 사용했었다. DB를 다루기 위해 select..., create..., show... 이렇게 동사로 시작하는 명령어를 사용한다. DB를 다루기 위한 기본적인 언어임에는 맞지만 SQL을 몰라도 DB를 사용할 수 있는 방법이 잘 개발되어 있다.
프로그래밍 언어 안에서 DB를 다루는 대표적인 방법은 DB가 사용하는 데이터구조를 프로그램이 사용하는 데이터구조에 대응시키는 것이다. 예를 들어 테이블(table)을 클래스(class)로 변환시킬 수 있다.
위와 같이 table을 class로 변환시켜서 사용하는 방법을 ORM(Object Related Model) 방법이라고 한다. 단어를 하나씩 살펴보면 Object와 Model(=table)을 연관시켰다(relating)는 뜻 그대로이다.
파이썬에서는 ORM을 구현해주는 라이브러리로 SQLAlchemy, peewee 등이 자주 사용된다. 여기서는 SQLAlchemy를 사용하여 DB를 클래스처럼 사용하는 방법에 대해 살펴보도록 하겠다. 널리 사용되는 관계형 DB(RDB)의 구성 단위는 table이라 할 수 있다. 즉, table 마다 class를 정의하게 된다. 사용자 정보 table을 class로 변경하기 위한 SQLAlchemy 사용 방법을 아래와 같이 기술할 수 있다.
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://flaskweb:your_password@localhost:3306/flaskdb'
db = SQLAlchemy(app)
class Member(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(30), unique=True, nullable=False)
email = db.Column(db.String(60), unique=True, nullable=False)
password = db.Column(db.String(60), unique=False, nullable=False)
db.create_all()
member1 = Member(username = 'elsa', email = 'elsa@abc.com', password = 'aB3xTup8')
member2 = Member(username = 'anna', email = 'anna@abc.com', password = '9srQcm52')
db.session.add(member1)
db.session.add(member2)
db.session.commit()
from flask_sqlalchemy import SQLAlchemy
→ 가장 먼저 해야할 일은 SQLAlchemy 클래스를 가져오는 것이다.
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://flaskweb:your_password@localhost:3306/flaskdb'
→ (별도 프로그램인) DB에 접속하기 위한 정보를 Flask 객체의 config 변수에 설정한다. MariaDB를 설치할 때 입력한 정보들이 설정 정보로 들어간다. 내용을 살펴보면 아래와 같다.
mysql+pymysql | DB타입+드라이버(driver) |
flaskweb:your_password@localhost:3306 | 사용자:패스워드@호스트이름:포트번호 |
flaskdb | DB프로그램 안의 데이터베이스 이름 |
※ 포트번호: 네트워크 안에서 컴퓨터는 보통 IP로 구별되고 컴퓨터 안에서 실행되는 다양한 프로그램들은 다시 포트번호(port number)로 구분된다.
db = SQLAlchemy(app)
→ Flask 객체에 설정한 내용을 이용하여 외부 DB 프로그램과 연결하는 객체를 생성한다.
class Member(db.Model):
id = db.Column(db.Integer, primary_key = True)
username = db.Column(db.String(30), unique = True, nullable = False)
...
→ SQLAlchemy 객체의 Model 클래스를 활용해서 회원정보 클래스를 만든다. 사용된 인자들의 내용은 아래와 같다.
db.Integer | 정수형 데이터를 저장한다. |
primary_key | 데이터베이스의 각 데이터들은 저장하고자 하는 데이터 외에 '고유키(unique key)'를 가져야 한다. 왜냐하면 저장하고자 하는 데이터의 내용이 같은 경우에도 고유키를 이용해서 구분할 수 있게하기 위해서이다. |
db.String | 문자형 데이터를 저장한다. |
unique | 데이터베이스의 테이블 안에서 값이 같은 다른 데이터를 허용하지 않는다. |
nullable | 데이터를 비워둘 수 없다. |
db.create_all()
→ 만약 Member 클래스에 해당하는 table이 DB 안에 생성되어 있지 않으면 대응되는 table을 생성한다.
member1 = Member(...)
member2 = Member(...)
→ 회원 각각을 객체로 만든다.
db.session.add(...)
→ DB에 회원데이터를 추가한다.
db.session.commit()
→ DB에 변경사항, 즉 회원데이터 추가 상태를 반영(commit)한다.
실행에 필요한 Flask-SQLAlchemy 패키지와 PyMySQL 패키지를 설치한다.
예제 스크립트를 실행하고 윈도우 커맨드 프롬프트 등을 이용해서 DB에 접속하여 실행 결과를 확인해보면 파이썬 프로그램의 내용이 DB에 반영된 것을 볼 수 있다.
$> mysql -u flaskweb -p
> use flaskdb;
> show tables;
> select * from member;
※ 테이블 이름은 대소문자 구분이 없기 때문에 Member 클래스에 대응되는 member 테이블이 생성되었다.
이어지는 글에서는 Flask 웹 서버 프로젝트 안에서 DB와 ORM을 사용하는 예를 좀 더 살펴보도록 하겠다.