FlaskおよびSQLiteで1対多のデータベース関係を使用する方法
著者はCOVID-19救済基金を選択し、 Write forDOnationsプログラムの一環として寄付を受け取りました。
序章
Flask は、Python言語を使用してWebアプリケーションを構築するためのフレームワークであり、 SQLite は、Pythonでアプリケーションデータを格納するために使用できるデータベースエンジンです。 このチュートリアルでは、FlaskとSQLiteを使用して、ユーザーがToDoアイテムのリストを作成できるToDoアプリケーションを作成します。 FlaskでSQLiteを使用する方法と、1対多のデータベース関係がどのように機能するかを学習します。
1対多のデータベース関係は、あるテーブルのレコードが別のテーブルの複数のレコードを参照できる2つのデータベーステーブル間の関係です。 たとえば、ブログアプリケーションでは、投稿を保存するためのテーブルは、コメントを保存するためのテーブルと1対多の関係を持つことができます。 各投稿は多くのコメントを参照でき、各コメントは1つの投稿を参照します。 したがって、 1つの投稿は、多くのコメントと関係があります。 postテーブルは親テーブルであり、commentsテーブルは子テーブルです。親テーブルのレコードは、子テーブルの多くのレコードを参照できます。 これは、各テーブルの関連データにアクセスできるようにするために重要です。
SQLiteは移植性があり、Pythonで動作するために追加の設定を必要としないため、SQLiteを使用します。 また、MySQLやPostgresなどのより大きなデータベースに移動する前にアプリケーションのプロトタイプを作成する場合にも最適です。 適切なデータベースシステムを選択する方法の詳細については、 SQLiteとMySQLとPostgreSQL:リレーショナルデータベース管理システムの比較の記事を参照してください。
前提条件
このガイドに従う前に、次のものが必要です。
- ローカルPython3プログラミング環境については、ローカルマシン用のPython3シリーズのローカルプログラミング環境をインストールおよびセットアップする方法のチュートリアルに従ってください。 このチュートリアルでは、プロジェクトディレクトリを
flask_todo
と呼びます。 - ルートの作成、HTMLテンプレートのレンダリング、SQLiteデータベースへの接続などの基本的なFlaskの概念の理解。 これらの概念に精通していない場合は、 Python 3でFlaskを使用してWebアプリケーションを作成する方法に従うことができますが、必須ではありません。
ステップ1—データベースの作成
このステップでは、プログラミング環境をアクティブ化し、Flaskをインストールし、SQLiteデータベースを作成して、サンプルデータを入力します。 外部キーを使用して、リストとアイテムの間に1対多の関係を作成する方法を学習します。 外部キーは、データベーステーブルを別のテーブルに関連付けるために使用されるキーであり、子テーブルとその親テーブルの間のリンクです。
プログラミング環境をまだアクティブ化していない場合は、プロジェクトディレクトリ(flask_todo
)にいることを確認し、次のコマンドを使用してアクティブ化します。
- source env/bin/activate
プログラミング環境がアクティブ化されたら、次のコマンドを使用してFlaskをインストールします。
- pip install flask
インストールが完了すると、ToDoデータを格納するために必要なテーブルを作成するためのSQLコマンドを含むデータベーススキーマファイルを作成できるようになります。 ToDoリストを格納するためのlists
というテーブルと、各リストの項目を格納するためのitems
テーブルの2つのテーブルが必要になります。
flask_todo
ディレクトリ内にあるschema.sql
というファイルを開きます。
- nano schema.sql
このファイル内に次のSQLコマンドを入力します。
DROP TABLE IF EXISTS lists;
DROP TABLE IF EXISTS items;
CREATE TABLE lists (
id INTEGER PRIMARY KEY AUTOINCREMENT,
created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
title TEXT NOT NULL
);
CREATE TABLE items (
id INTEGER PRIMARY KEY AUTOINCREMENT,
list_id INTEGER NOT NULL,
created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
content TEXT NOT NULL,
FOREIGN KEY (list_id) REFERENCES lists (id)
);
ファイルを保存して閉じます。
最初の2つのSQLコマンドはDROP TABLE IF EXISTS lists;
とDROP TABLE IF EXISTS items;
です。これらは、lists
とitems
という名前の既存のテーブルを削除するため、混乱を招く動作は見られません。 これにより、これらのSQLコマンドを使用するたびにデータベースにあるすべてのコンテンツが削除されるため、このチュートリアルを終了して最終結果を試すまで、Webアプリケーションに重要なコンテンツを書き込まないようにしてください。
次に、CREATE TABLE lists
を使用して、次の列を持つTo Doリスト(学習リスト、作業リスト、ホームリストなど)を格納するlists
テーブルを作成します。
id
:主キーを表す整数。これには、各エントリのデータベースによって一意の値が割り当てられます(つまり、 やることリスト)。created
:やることリストが作成された時刻。NOT NULL
は、この列が空であってはならないことを意味し、DEFAULT
値はCURRENT_TIMESTAMP
値であり、リストがデータベースに追加された時刻です。id
と同様に、この列の値は自動的に入力されるため、指定する必要はありません。title
:リストのタイトル。
次に、items
というテーブルを作成して、やること項目を保存します。 このテーブルには、ID、アイテムが属するリストを識別するためのlist_id
整数列、作成日、およびアイテムのコンテンツがあります。 アイテムをデータベース内のリストにリンクするには、外部キー制約と行FOREIGN KEY (list_id) REFERENCES lists (id)
を使用します。 ここで、lists
テーブルは親テーブルであり、外部キー制約によって参照されているテーブルです。これは、リストに複数のアイテムを含めることができることを示しています。 items
テーブルは、子テーブルであり、制約が適用されるテーブルです。 これは、アイテムが単一のリストに属していることを意味します。 list_id
列は、lists
親テーブルのid
列を参照します。
リストには多くのアイテムを含めることができ、アイテムは 1つのリストにのみ属するため、lists
テーブルとitems
テーブルの関係は[ X155X]1対多