👀 Flask 웹서버 구동하고 난 뒤 DB연동을 해보겠다. 기존에는 항상 쿼리(질의문)을 사용했었다. 이번에는 ORM을 적용하여 SQLAlchemy를 사용해 보겠다.
sqlite
는 따로 설치 과정 필요 없이 python 기본 패키지에 포함이 되어 있어 바로 사용 가능하다.🤳
SQLAlchemy는 파이썬을 위한 ORM(Object-relational-mapping) 중 하나이다. ORM을 사용하면 SQL 질의어를 쓰지 않고, CRUD 등을 공통된 접근기법으로 사용할 수 있다.
Flask에서는 사용하기 쉽게 만들어진Flask-SQLAlchemy
가 있다.
일단 Flask-SQLAlchemy를 설치한다.
# flask-sqlalchemy 설치
(flask_evn) pip install flask-sqlalchemy
먼저 ORM으로 만들기 때문에 데이터 모델을 만들어야 한다.
project 폴더 내에 models.py
에 만든다.
먼저 사용자 데이터 모델을 나타내는 객체를 하나 선언 한다.
그리고 SQLAlchemy의 기능을 사용하기 위해 db.Model
을 상속 받는다. 기본적으로 데이터베이스 테이블 이름은 자동으로 정의되지만 __table_name__
을 이용해 명시적으로 정할 수 있다.
테이블의 컬럼을 만들기 위해서는 db.Column()
을 이용한다.
db.Column()
은 데이터 타입에 대한 정보와 제약 조건들을 넣어줄 수 있다.
# models.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True)
userid = db.Column(db.String(32))
password = db.Column(db.String(128))
기존에 있던 app.py
에 추가한다.
SQLAlchemy 에서 사용할 데이터베이스를 설정하고 연결한다.
SQLALCHEMY_TRACK_MODIFICATIONS
의 경우에는 추가적인 메모리를 필요로 하므로 False로 둔다. 설정하지 않으면 최신 버전에서는 Warning 메세지가 발생한다.
# app.py 추가내용
import os
from models import db
# 현재있는 파일의 디렉토리 절대경로
basdir = os.path.abspath(os.path.dirname(__file__))
# basdir 경로안에 DB파일 만들기
dbfile = os.path.join(basdir, 'db.sqlite')
# SQLAlchemy 설정
# 내가 사용 할 DB URI
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + dbfile
# 비지니스 로직이 끝날때 Commit 실행(DB반영)
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
# 수정사항에 대한 TRACK
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# SECRET_KEY
app.config['SECRET_KEY'] = 'jqiowejrojzxcovnklqnweiorjqwoijroi'
db.init_app(app)
db.app = app
db.create_all()
# app.py 전체 코드
import os
from models import db
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/register')
def register():
return render_template('register.html')
@app.route('/')
def hello_world():
return render_template('hello.html')
basdir = os.path.abspath(os.path.dirname(__file__))
dbfile = os.path.join(basdir, 'db.sqlite')
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + dbfile
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SECRET_KEY'] = 'jqiowejrojzxcovnklqnweiorjqwoijroi'
db.init_app(app)
db.app = app
db.create_all()
if __name__ == '__main__':
app.run(host='127.0.0.1', port=5000, debug=True)
가상환경에서 python app.py
실행하면 project 폴더 안에 db.sqlite
파일이 생긴다.
(flask_evn) python app.py
명령어로 테이블을 확인한다.
(flask_evn) sqlite3 db.sqlite
# 테이블 확인
sqlite> .tables
User
# 테이블 스키마 확인
sqlite> .schema User
CREATE TABLE user (
id INTEGER NOT NULL,
userid VARCHAR(32),
password VARCHAR(128),
PRIMARY KEY (id)
);