FlaskとSQLiteを使用して、One-to-Manyリレーションシップのデータを管理する方法について完全かつ包括的に説明します。このガイドでは、Flaskの基本的なセットアップから始め、SQLiteデータベースを使用してOne-to-Manyリレーションシップをどのように設計し、変更するかについてステップバイステップで解説します。
1. Flaskアプリケーションのセットアップ
まず、Flaskを使用したWebアプリケーションをセットアップします。Flaskは軽量なPythonのWebフレームワークで、簡単にウェブアプリを開発できます。SQLiteは軽量な関係型データベースで、Flaskと非常にうまく連携します。

必要なパッケージのインストール
以下のコマンドを使用してFlaskとSQLAlchemy(Flaskでデータベース操作を行うためのライブラリ)をインストールします。
bashpip install Flask Flask-SQLAlchemy
アプリケーションの初期設定
次に、Flaskアプリケーションを作成し、SQLiteデータベースを接続します。
pythonfrom flask import Flask, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
if __name__ == '__main__':
app.run(debug=True)
2. One-to-Manyリレーションシップの設計
次に、One-to-ManyリレーションシップをSQLiteデータベースで表現します。例えば、「著者」と「本」のリレーションを考えてみましょう。一人の著者は複数の本を持つことができますが、逆に一つの本は一人の著者にしか属しません。
モデルの定義
Flask-SQLAlchemyを使用して、Author
と Book
のテーブルを定義します。
pythonclass Author(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), nullable=False)
books = db.relationship('Book', backref='author', lazy=True)
def __repr__(self):
return f"Author('{self.name}')"
class Book(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False)
author_id = db.Column(db.Integer, db.ForeignKey('author.id'), nullable=False)
def __repr__(self):
return f"Book('{self.title}')"
ここで、Author
クラスと Book
クラスの間にOne-to-Manyのリレーションシップを定義しています。books
フィールドは、Author
クラスから Book
クラスへのリレーションを示し、author_id
フィールドは Book
クラスがどの著者に属しているかを示します。
3. データベースの作成
上記のモデルをデータベースに反映させるために、以下のコマンドを実行してデータベースを作成します。
pythonwith app.app_context():
db.create_all()
これにより、Author
と Book
のテーブルがSQLiteデータベースに作成されます。
4. データの操作
次に、One-to-Manyリレーションシップを操作する方法について説明します。具体的には、新しい著者と本を追加する方法、既存の本を更新する方法、および著者に関連する本を削除する方法を見ていきます。
新しい著者と本を追加
新しい著者とその著者が書いた本を追加するには、次のようにします。
python@app.route('/add', methods=['GET', 'POST'])
def add_author_and_books():
if request.method == 'POST':
author_name = request.form['author_name']
book_titles = request.form.getlist('book_titles')
new_author = Author(name=author_name)
db.session.add(new_author)
db.session.commit()
for title in book_titles:
new_book = Book(title=title, author_id=new_author.id)
db.session.add(new_book)
db.session.commit()
return redirect(url_for('index'))
return render_template('add_author_and_books.html')
このコードでは、POST
リクエストを受け取り、新しい著者とその本をデータベースに追加しています。book_titles
はリストとして受け取り、各本に対して新しい Book
を作成します。
本の更新
次に、本の情報を更新する方法を見ていきます。例えば、本のタイトルを変更する場合は、次のようにします。
python@app.route('/update_book/' , methods=['GET', 'POST'])
def update_book(book_id):
book = Book.query.get_or_404(book_id)
if request.method == 'POST':
book.title = request.form['title']
db.session.commit()
return redirect(url_for('index'))
return render_template('update_book.html', book=book)
book_id
を指定して、該当する本を検索し、そのタイトルを更新しています。
本の削除
本を削除する場合も、Flask-SQLAlchemyのORMを使って簡単に削除できます。
python@app.route('/delete_book/' )
def delete_book(book_id):
book = Book.query.get_or_404(book_id)
db.session.delete(book)
db.session.commit()
return redirect(url_for('index'))
これにより、指定した book_id
の本が削除されます。
5. テンプレートの作成
最後に、HTMLテンプレートを作成して、データの入力と表示を行います。例えば、著者とその本を表示するためのテンプレートを以下のように作成できます。
htmlhtml>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>著者と本title>
head>
<body>
<h1>著者とその本h1>
<ul>
{% for author in authors %}
<li>
<strong>{{ author.name }}strong>
<ul>
{% for book in author.books %}
<li>{{ book.title }}li>
{% endfor %}
ul>
li>
{% endfor %}
ul>
body>
html>
このテンプレートでは、すべての著者とその本をリストとして表示しています。
6. まとめ
FlaskとSQLiteを使って、One-to-Manyリレーションシップを構築し、データを操作する方法について説明しました。著者と本の例を使用しましたが、同様の方法で他のOne-to-Manyリレーションシップを実装できます。Flask-SQLAlchemyを使うことで、データベースの操作が非常に簡単になります。