대학 생활/Python
[Flask] 데이터베이스 연결
opid
2014. 10. 17. 00:00
데이터베이스 처리
연결
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()