본문 바로가기

대학 생활/Python

[Flask] 데이터베이스 연결


파이썬 웹 프로그래밍

저자
주성식, 홍성민 지음
출판사
위키북스 | 2014-01-28 출간
카테고리
컴퓨터/IT
책소개
파이썬으로 쉽고 재미있게 웹 프로그래밍을 시작하세요![파이썬 웹...
가격비교

데이터베이스 처리

연결

connect_db()를 통해 데이터베이스의 연결을 반환 값으로 받는다.

from sqlite3 import dbapi2 as sqlite3
...
DATABASE = '/tmp/minitwit.db'
...
def connect_db():
    return sqlite3.connect(app.config['DATABASE'])

연결과 종료

연결과 종료를 before_request()와 teardown_request() 데코레이터를 이용해 좀 더 모듈화한다. 

before_request()는 요청에 앞서서 실행되는 함수 정의.

teardown_request()는 응답이 생성된 후에 실행되는 함수 정의.

g 객체는 전역(global) 객체를 의미하며 한 번의 요청에 대해서만 같은 값을 유지하고 스레드에 대해 안전하다는 전제 조건이 있다.

@app.before_request
def before_request():
    g.db = connect_db()
    g.user = None
    if 'user_id in session:
        g.user = query_db('select * from user where user_id = ?', [session['user_id']], one=True)

@app.teardown_request
def teardown_request(exception):
    if hasattr(g, 'db'):
        g.db.close()

질의 처리

세 가지 인자로 1. 실행할 질의문, 2. 바인딩 변수라 불리는 질의문에 들어갈 인자(튜플 형태), 3. 결과값으로 리스트 전체를 받을 것인지 리스트의 첫 번째 요소만을 받을 것인지 결정하는 불린(boolean) 값

g 객체에 설정한 데이터베이스 연결을 이용해서 질의문과 바인딩 변수를 실행하고 결과에 대한 커서(cursor)를 얻는다. 그 결과 커서에서 전체 레코드를 꺼내(fetch) 로우(row)를 한 줄씩 읽으면서 그 로우에 있는 컬림(column)의 이름과 값을 dict 형태로 변환한다. 세 번째 인자에 True가 넘어오면 딕셔너리 형태로 변환된 한 개의 로우만 반환되고, False가 넘어오면 전체 로우가 반환된다.

def query_db(query, args=(), one=False):
    cur = g.db.execute(quert, args)
    rv = [dict((cur.description[idx][0], value)
                    for idx, value in enumerate(row)) for row in cur.fetchall()]
    return (rv[0] if rv else None) if one else rv


데이터베이스 초기화

데이터베이스 초기화함수

def init_db():
    with closing(connect_db()) as db:
        with app.open_resource('schema.sql') as f:
            db.cursor().executescript(f.read())
        db.commit()