敵のいない勉強部屋

日々学んだことや感じたことを書きます

英語字幕DB作成への道_SQLite編② (Flaskとの連携)

今日はこちらのサイトを参考に、FlaskとSQLiteを連携してみました。
flask.palletsprojects.com

ポイント① DBのコネクションを使いわす & 必ず閉じる

import sqlite3
from flask import g

DATABASE = '/path/to/database.db'

def get_db():
    db = getattr(g, '_database', None)
    if db is None:
        db = g._database = sqlite3.connect(DATABASE)
    return db

@app.teardown_appcontext
def close_connection(exception):
    db = getattr(g, '_database', None)
    if db is not None:
        db.close()

上記のコードを書くことで、「1つのリクエストの中で1つのコネクションを使い回せる」&「リクエスト終了時に自動的にコネクションを閉じる」ということができるようになるようです。
要は無駄なコネクションを作りすぎたり、消し忘れたりすることがなくなるってことですね。
正直なところ、これをやらなかったときにどんなリスクがあるかは分かっていないので、
それはまた別の機会に調べてみたいと思います。

ポイント② DBの初期化はこう書いておくと便利

def init_db():
    with app.app_context():
        db = get_db()
        with app.open_resource('schema.sql', mode='r') as f:
            db.cursor().executescript(f.read())
        db.commit()

こんな風にapp_context()を使って書くことで、
pythonのshellから get_db()を使うことができて便利だそうです。
これはアプリケーションコンテキストを理解していないと、
便利さを完全には理解できなさそうです。

from yourapplication import init_db
init_db()

少し込み入った話になってきました!
勉強することも増えてきたので、ドキュメントを読み込まなくては。
今日も一歩前進できて良かったです