flaskでWebアプリ開発、データベースを利用する2

1_プログラミング

引き続き、flaskアプリをデータベースに接続していきますよ〜

データベースをマスターすれば色々と応用が広がるね

flaskのチュートリアル、データベースを利用する続きを進めていきます。

前回からの続きになります。前回の記事はこちらを参照ください。

こんな人の役に立つかも

・PythonでWebアプリケーションを作成したい人

・flaskを勉強している人

・flaskでデータベース(SQLite)を利用したい人

スポンサーリンク

schema.sqlの作成

以下のように、flaskrフォルダ内にSQLを記載した「schema.sql」ファイルを作成します。

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ファイルに記載される文は、SQLというデータベース(リレーショナルデータベース)を操作するための言語です。リレーショナルデータベースは、エクセルの表のようにデータを管理するような形式のデータベースというイメージです。

このSQL文は、データベースの初期化の際に実行される文になりますので、まず最初に初期化を行うには、すでにデータベースに「user」と「post」という今回作成するテーブルが存在していたら、それを削除する必要があります。それが、最初2行の「DROP」から始まる命令になります。

そして、今回のWebアプリで管理するべきデータの格納テーブルを「CREATE TABLE」で作成しています。

今回のチュートリアルのWebアプリでは、①ユーザーデータ、②記事データの二種類をデータベースで管理しますので、データのテーブルとしては、

①「user」データテーブル

②「post」データテーブル

を作成します。

「user」データテーブル

主キーが「id」で、自動で増加する設定です。そして、「username」の項目と「password」の項目を登録しています。

「username」はNULL、すなわち何も入力していないということがないように、また、UNIQUEということで、他にかぶるものがないようなデータ形式である必要があると定義しています。

「password」については、NULL、何も入力していない状態でなければOKという設定です。

上記の条件を項目に紐づけてデータベースにテーブルを作成します。

「post」データテーブル

主キーが「id」で、自動で増加していくような設定です。

項目としては、「created」に日時、「author_id」に作者のID番号(userテーブルのid)、「title」に投稿のタイトル、「body」には本文を入れるようなデータテーブルになります。「FOREIGN KEY」は外部キーといって、他のテーブルとデータを紐づけるような設定をしています。postテーブルの「author_id」userテーブルの「id」が紐づくことになります。

投稿には、同じユーザーが被ってもOKですが、ユーザーデータ管理では、ユーザーが重複しないように管理しています。このように「ユーザー」と「投稿」をテーブルで分けて「外部キー」で紐づけることで、無駄のないデータの管理ができます。

データベースの設計は、それだけでボリュームのある内容になるので、データベースについて勉強する場合、少し切り離して考えた方がいいと思います。

今回は、ユーザー情報が「user」投稿内容が「post」という表にどんどん追加されていく、というくらいのイメージで良さそうですね。

アプリにデータベースを設定

前回のdb.py作成時に、「init_app」関数を作成しました。「init_app」関数では、データベースの終了の処理「close_db」と、flaskコマンドへの登録処理「init_db_command」を設定しています。この「init_app」関数をアプリケーションファクトリ内で実行するように「__init__.py」を変更します。

※変更点はコメントの2行追加のみです

import os

from flask import Flask

def create_app(test_config=None):
    # create and configure the app
    app = Flask(__name__, instance_relative_config=True)
    app.config.from_mapping(
        SECRET_KEY='dev',
        DATABASE=os.path.join(app.instance_path, 'flaskr.sqlite'),
    )

    if test_config is None:
        # load the instance config, if it exists, when not testing
        app.config.from_pyfile('config.py', silent=True)
    else:
        # load the test config if passed in
        app.config.from_mapping(test_config)

    # ensure the instance folder exists
    try:
        os.makedirs(app.instance_path)
    except OSError:
        pass

    # a simple page that says hello
    @app.route('/hello')
    def hello():
        return 'Hello, World!'


    #↓ここにinit_app関数を追加
    from . import db
    db.init_app(app)

    return app

これまで作成したプログラムの関数の関連を整理すると、次の図のような感じになります。

少し入り組んできましたね・・・

データベースを初期化

ここまで出来たら、Flaskコマンドをつかってデータベースの初期化ができるかを実行してみます。

flask-tutorialの階層に移動し、pythonの仮想環境を起動します。

$ cd flask-tutorial
$ . venv/bin/activate

windowsの場合は、仮想環境の起動が

> venv\Script\activate

と違います。

最後に、カスタムコマンドで作成した「init-db」コマンドを実行してみます。

(venv)$ flask init-db
Initialized the database.

このように「Initialized the databese」と確認できれば、正常に動作したことがわかります。

また、次のようにSQLiteのデータベースファイルが作成されることがわかります。flaskrアプリは、このデータベースファイルにユーザー情報と投稿情報を保存していくようになります。

タイトルとURLをコピーしました