Back to Blog

FlaskでTodoリストの作成その2~データベースの設定~

flask

2024年10月1日

こんにちは!

今回の記事では、FlaskでTodoリストの作成を行います。Todoリストの作成は全3回の記事でお伝えします。今回は第2回目です!

データベースの設定

タスクを追加するということは、タスクの情報を保存しておく必要があります。

データを保存するためには、データベースが必要になります。

Flaskの開発環境でデータベースを使用するには、flask_SQLAlchemyを使うと簡単に実装できます。

以下のコマンドでモジュールをインストールします。python app.pyを実行中の場合は、[Ctrl + C ]で中断してから以下のコマンドを実行しましょう。

pip install Flask-SQLAlchemy Flask-Migrate

次に、app.pyでflask_SQLAlchemyを使用する設定を行います。

app.pyの上部に追記しましょう。

# app.py
from flask import Flask, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy  #←追加
from flask_migrate import Migrate  #←追加

app = Flask(__name__)

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///todo.db' #←追加
db = SQLAlchemy(app) #←追加
migrate = Migrate(app, db)#←追加

追加した部分の解説は以下の通りです。

・app.config[‘SQLALCHEMY_DATABASE_URI’] = ‘sqlite:///todo.db’ は、Flaskアプリケーションで使用するデータベースの接続先を設定しています。

・db = SQLAlchemy(app) という行は、FlaskアプリケーションでSQLAlchemyを使用するための準備を行っています。

・migrate = Migrate(app, db)という行は、データベースの管理を簡単にするためにマイグレーションを有効にしています。マイグレーションとは、データベースのスキーマ(構造)をバージョン管理し、変更を適用することです。

データベースのテーブルを定義

次にデータベースのテーブルを定義します。

テーブルとはデータベースの基本的な構造で、行(レコード)と列(フィールド)で構成されます。エクセルのシートのようなイメージです。

テーブルを定義は、テーブルにどのようなデータがどのような形で入るのかを定義します。

また、テーブル定義のことをモデルと呼びます。

app.pyに以下のように記述しましょう。

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///todo.db'
db = SQLAlchemy(app)
migrate = Migrate(app, db)

#↓ここから追加
class Task(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    content = db.Column(db.String(200), nullable=False)
    completed = db.Column(db.Boolean, default=False)

これはTaskテーブルの定義をしています。

id、content(タスクの内容)、complete(タスク完了の有無)の3つの情報を格納する構造を作成しました。

データベースのテーブル定義については後ほど詳しく解説します。

ここまで変更した内容を反映した、app.pyの全文はこちら

# app.py
from flask import Flask, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate  

app = Flask(__name__)

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///todo.db'
db = SQLAlchemy(app)
migrate = Migrate(app, db)

class Task(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    content = db.Column(db.String(200), nullable=False)
    completed = db.Column(db.Boolean, default=False)

@app.route('/')
def index():
    return render_template('index.html')

if __name__ == "__main__":
    app.run(debug=True)

データベースに反映

ここまでで、データベースの設定とテーブルの定義が完了しました。

しかし、まだデータベースは作成されておらず、何もない状態です。

作成するためには、以下のコマンドを実行します。

#dbの初期化(初回のみ実行)
flask db init

#dbのマイグレート
flask db migrate

#dbへ反映
flask db upgrade

flask db upgradeコマンドが正常に完了すると、データベースにテーブルが作成されます。

コマンド実行後、instanceディレクトリとmigrateionsディレクトリが作成されています。instanceディレクトリには、データベースのファイルが格納されており、migrationsファイルには、データベースの構造や変更履歴の情報などが格納されています。

今回app.pyにTaskモデルを作成したので、Taskのテーブルが作成されました。

タスクの追加機能の実装 – 追加画面の実装

データベースの作成が完了したら、次はタスクを追加する画面を作成します。

ルーティングの設定

タスクの追加する画面は、URL http://127.0.0.1:5000/add_taskにアクセスした際に表示させます。

app.pyに以下の内容を追加します。(indexの下に追加してください)

@app.route('/')
def index():
    return render_template('index.html')

# ↓以下を追加
@app.route('/add_task', methods=['GET', 'POST'])
def add_task():
    if request.method == 'POST':
        task_content = request.form['content']
        new_task = Task(content=task_content)

        try:
            db.session.add(new_task)
            db.session.commit()
            return redirect('/')
        except:
            db.session.rollback()
            return 'There was an issue adding your task'

    return render_template('add_task.html')

コードの詳細については、後ほど解説しますが、/add_taskにアクセスした際にadd_task.htmlを表示させる機能と、タスクをデータベースへ保存する機能があります。

HTMLの作成

続いて、HTMLを作成します。

templatesディレクトリ配下に、add_task.htmlというファイルを作成しましょう。そして、以下の内容を記述します。

<!-- templates/add_task.html -->

<!DOCTYPE html>
<html>
<head>
    <title>Add Task</title>
</head>
<body>
    <h1>Add Task</h1>
    <form action="add_task" method="POST">
        <input type="text" name="content" required>
        <button type="submit">追加</button>
    </form>
    <a href="./">Homeに戻る</a>
</body>
</html>

これは、タスクを追加するフォームのHTMLです。

http://127.0.0.1:5000/add_taskにアクセスすると、input画面が表示され、タスクの追加が可能になります。

TOPページの修正

タスクの追加が完成したら、TOPページも修正しましょう。

追加したタスクをデータベースから出力することと、追加ページへのリンクを加えます。

まず、app.pyを以下のように修正します。

@app.route('/')
def index():
    tasks = Task.query.all() #←追加
    return render_template('index.html', tasks=tasks) #←一部修正

Task.query.all()は、タスクのデーターをすべて取得してtasksという変数に代入しています。

tasksはHTMLで出力するために、render_template(‘index.html’, tasks=tasks)の設定をしています。

次に、templates/index.htmlを修正します。

<!-- templates/index.html -->

<!DOCTYPE html>
<html>
<head>
    <title>Flask Todo App</title>
</head>
<body>
    <h1>Todo List</h1>
    <ul>
        <!-- 以下の部分を変更 -->
        {% for task in tasks %}
         <li>{{ task.content }}</li>
        {% endfor %}
    </ul>
    <a href="add_task">タスクの追加</a>
</body>
</html>

これで、追加したタスクがTOPページの一覧にも表示できるようになりました。

現在のapp.pyの全文はこちら

# app.py
from flask import Flask, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate  

app = Flask(__name__)

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///todo.db'
db = SQLAlchemy(app)
migrate = Migrate(app, db)

class Task(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    content = db.Column(db.String(200), nullable=False)
    completed = db.Column(db.Boolean, default=False)

@app.route('/')
def index():
    tasks = Task.query.all()
    return render_template('index.html', tasks=tasks)

@app.route('/add_task', methods=['GET', 'POST'])
def add_task():
    if request.method == 'POST':
        task_content = request.form['content']
        new_task = Task(content=task_content)

        try:
            db.session.add(new_task)
            db.session.commit()
            return redirect('/')
        except:
            db.session.rollback()
            return 'There was an issue adding your task'

    return render_template('add_task.html')

if __name__ == "__main__":
    app.run(debug=True)

動作確認

ここまでの内容の動作確認をしてみましょう。Flaskを起動します。

python app.py

Flaskを起動したら、http://127.0.0.1:5000へアクセスしてみましょう。

現状では、タスクを追加できると思います。

まとめ

今回はデータベースの設定を行い、タスクを保存できるようにしました。第3回目ではTodoリストに必要な機能をさらに追加していきます。

             

Pythonの基礎から応用まで学べる
Python WebAcademy

Python WebAcademyでは、Pythonの基礎からアーキテクチャなどの応用的な内容まで幅広く学べます。また、ブラウザ上で直接Pythonコードを試すことができ、実践的なスキルを身につけることが可能です。

無料で試す