プログラミング

FlaskでOne-to-Manyリレーション管理

FlaskとSQLiteを使用して、One-to-Manyリレーションシップのデータを管理する方法について完全かつ包括的に説明します。このガイドでは、Flaskの基本的なセットアップから始め、SQLiteデータベースを使用してOne-to-Manyリレーションシップをどのように設計し、変更するかについてステップバイステップで解説します。

1. Flaskアプリケーションのセットアップ

まず、Flaskを使用したWebアプリケーションをセットアップします。Flaskは軽量なPythonのWebフレームワークで、簡単にウェブアプリを開発できます。SQLiteは軽量な関係型データベースで、Flaskと非常にうまく連携します。

必要なパッケージのインストール

以下のコマンドを使用してFlaskとSQLAlchemy(Flaskでデータベース操作を行うためのライブラリ)をインストールします。

bash
pip install Flask Flask-SQLAlchemy

アプリケーションの初期設定

次に、Flaskアプリケーションを作成し、SQLiteデータベースを接続します。

python
from 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を使用して、AuthorBook のテーブルを定義します。

python
class 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. データベースの作成

上記のモデルをデータベースに反映させるために、以下のコマンドを実行してデータベースを作成します。

python
with app.app_context(): db.create_all()

これにより、AuthorBook のテーブルが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テンプレートを作成して、データの入力と表示を行います。例えば、著者とその本を表示するためのテンプレートを以下のように作成できます。

html
html> <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を使うことで、データベースの操作が非常に簡単になります。

Back to top button