Skip to content

3: データベースの設定

今回はデータベースの設定を行います。
サーバーを停止してもサーバ上にデータが残るようにしましょう。

💡 データベース:
プログラムを停止してもデータが無くならないようにすることを「永続化」といいます。
永続化されたデータの集まりのことをデータベースと呼びます。
このチュートリアルでは SQLite というライブラリを使ってデータベースの作成や更新をしていきます。

まず、データベースの設定を行います。todo-api/app/database.py を以下のように編集します:

todo-api/app/database.py
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# 1. データベースのURL設定
SQLALCHEMY_DATABASE_URL = "sqlite:///./todo.db"
# 2. データベースエンジンの作成
engine = create_engine(
SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False}
)
# 3. セッションの作成
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
# 4. モデルのベースクラス
Base = declarative_base()
# 5. データベースセッションを取得する関数
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
  1. データベースのURL設定

    SQLALCHEMY_DATABASE_URL = "sqlite:///./todo.db"
    • SQLite データベースのファイルパスを指定します
    • ./todo.db はサーバを起動したディレクトリに todo.db というファイルを作成します
  2. データベースエンジンの作成

    engine = create_engine(
    SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False}
    )
    • SQLAlchemyのエンジンを作成します
    • エンジンはサーバからデータベースへのすべての接続などを管理します
    • check_same_thread=False は、複数のスレッドからデータベースにアクセスできるようにします
  3. セッションの作成

    SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
    • データベースセッションを作成するためのファクトリを定義します
    • セッションはエンジンが管理している接続情報を使ってデータベースに接続し、取得したデータをPythonのオブジェクトに変換する処理などを担当します
  4. モデルのベースクラス

    Base = declarative_base()
    • すべてのモデル(データベースのテーブルをPythonのクラスとして表現したもの)の基底クラスを作成します
    • このクラスを継承して、データベースのテーブルを定義します
  5. データベースセッションを取得する関数

    def get_db():
    db = SessionLocal()
    try:
    yield db
    finally:
    db.close()
    • データベースセッションを取得するための関数です
    • yield を使用して、セッションを自動的に閉じるようにしています

次に、Todoのデータモデルを作成します。todo-api/app/models.py を以下のように編集します:

todo-api/app/models.py
from sqlalchemy import Column, Integer, String, Boolean
from .database import Base
class Todo(Base):
__tablename__ = "todos"
id = Column(Integer, primary_key=True, index=True)
title = Column(String, index=True)
completed = Column(Boolean, default=False)
  1. テーブル名の定義

    __tablename__ = "todos"
    • データベースのテーブル名を todos に設定します
  2. カラムの定義

    id = Column(Integer, primary_key=True, index=True)
    title = Column(String, index=True)
    completed = Column(Boolean, default=False)
    • id: Todoの一意の識別子(主キー)
    • title: Todoのタイトル(インデックス付き)
    • completed: 完了状態(デフォルトはFalse)

データベースとテーブルを作成するために、todo-api/app/main.py を以下のように更新します:

todo-api/app/main.py
from fastapi import FastAPI
from . import models
from .database import engine
# データベースのテーブルを作成
models.Base.metadata.create_all(bind=engine)
app = FastAPI()
@app.get("/todos")
def read_todos():
return [
{"id": 1, "title": "買い物に行く", "completed": False},
{"id": 2, "title": "宿題をする", "completed": True}
]
  1. サーバーを再起動します:

    Terminal window
    uvicorn app.main:app --reload
  2. データベースファイル(todo-api/todo.db)が作成されたことを確認します:

以下の質問に答えて、学習内容を確認しましょう!

  1. SQLAlchemyでモデルを定義する際の正しい書き方は?

    • A: class Todo(Base):
    • B: class Todo(models.Model):
    • C: class Todo(database.Model):
答えを見る

答え: A: class Todo(Base):

  • SQLAlchemyでは、Baseクラスを継承してモデルを定義します
  • Basedeclarative_base()で作成した基底クラスです
  • 参考: SQLAlchemy公式ドキュメント

このステップでは以下について学びました。

  • データベースの基本

    • データベースURLの設定
    • データベースエンジンの作成
    • セッションの管理
  • モデルの定義

    • テーブルの定義
    • カラムの定義