데이터베이스 처리
연결
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()
'대학 생활 > Python' 카테고리의 다른 글
[Django] 장고 시작하기(설치, 생성, 실행) (0) | 2015.12.04 |
---|---|
[Python 3] 팩토리얼(factorial) 구하기 (0) | 2014.08.22 |
[Python] 파이썬 예약어 (0) | 2014.08.02 |
[Python] 더 좋은 assert() : assertEqual() (0) | 2014.03.14 |