ラズパイデスクトップでFlask入門(3)Tutorial Define And Access Database
こんばんは。國松です。
Flask Tutorialの2回目です。今回はデータベースの設定をしていきたいと思います。
参考サイト
Welcome to Flask (英語版)
Flaskへようこそ (日本語版)
Define and Access the Database
Blogアプリは、SQLiteデータベースを使用してユーザーと投稿を保存します。 Pythonには、sqlite3モジュールでSQLiteのサポートが組み込まれています。
SQLiteは、別のデータベースサーバーをセットアップする必要がなく、Pythonに組み込まれているため便利です。ただし、同時要求がデータベースに同時に書き込もうとすると、各書き込みが順次行われるため、要求が遅くなります。小さなアプリケーションでは気にならないかもしれませんが大規模なアプリの場合は別のデータベースに切り替えた方がいいでしょう。
Connect to the Database(DB操作のための関数を定義)
SQLiteデータベース(および他のほとんどのPythonデータベースライブラリ)を操作するときに最初に行うことは、それへの接続を作成することです。クエリと操作はすべて、接続を使用して実行されます。接続は、作業の終了後に閉じられます。
Webアプリケーションでは、この接続は通常、リクエストに関連付けられています。要求を処理するときのある時点で作成され、応答が送信される前に閉じられます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import sqlite3 import click from flask import current_app, g from flask.cli import with_appcontext #DBより接続情報を取得。キー'bd'に接続情報を与える def get_db(): if 'db' not in g: g.db = sqlite3.connect( current_app.config['DATABASE'], detect_types=sqlite3.PARSE_DECLTYPES ) g.db.row_factory = sqlite3.Row return g.db #データベースを閉じる def close_db(e=None): db = g.pop('db', None) if db is not None: db.close() |
gはリクエストごとに一意な特別なオブジェクトです。要求中に複数の機能によってアクセスされる可能性のあるデータを保存するために使われます。
current_appはアプリケーション本体の情報や設定のためのオブジェクト。
sqlite3.connect()は データベースへ接続を確立します。
sqlite3.Row() はdictionaryの様にふるまう行を返す様に指示します。これにより名前(カラム名)で列にアクセスできる様になります。
Create The Table
SQliteではデータはテーブルとカラムに保存されます。データを取得、保存する前にそれらを作成する必要があります。
Blogアプリではユーザーはユーザーテーブルに、投稿を投稿テーブルに保存します。
空のテーブルを作成にするのに必要なSQLコマンドを用いてファイルを作成していきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | DROP TABLE IF EXISTS user; DROP TABLE IF EXISTS post; CREATE TABLE user ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT UNIQUE NOT NULL, password TEXT NOT NULL ); CREATE TABLE post ( id INTEGER PRIMARY KEY AUTOINCREMENT, author_id INTEGER NOT NULL, created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, title TEXT NOT NULL, body TEXT NOT NULL, FOREIGN KEY (author_id) REFERENCES user (id) ); |
これらのSQLコマンドを実行するPython関数をdb.pyに追記します。
1 2 3 4 5 6 7 8 9 10 11 12 13 | def init_db(): db = get_db() with current_app.open_resource('schema.sql') as f: db.executescript(f.read().decode('utf8')) @click.command('init-db') @with_appcontext def init_db_command(): """Clear the existing data and create new tables.""" init_db() click.echo('Initialized the database.') |
open_resource()は、flaskrパッケージに関連するファイルを開きます。
get_dbはデータベース接続を返します。これは、ファイルから読み取ったコマンドを実行するために使用されます。
click.command()は、init_db関数を呼び出すinit-dbというコマンドラインコマンドを定義します。
データベースの定義とそれを操作する関数の定義が終わりました。次回は今回作成したデータベースをアプリに登録していきます。