3: データベースの設定
このステップで学ぶこと
Section titled “このステップで学ぶこと”今回はデータベースの設定を行います。
サーバーを停止してもサーバ上にデータが残るようにしましょう。
💡 データベース:
プログラムを停止してもデータが無くならないようにすることを「永続化」といいます。
永続化されたデータの集まりのことをデータベースと呼びます。
このチュートリアルでは SQLite というライブラリを使ってデータベースの作成や更新をしていきます。
データベースの設定
Section titled “データベースの設定”まず、データベースの設定を行います。todo-api/app/database.py
を以下のように編集します:
from sqlalchemy import create_enginefrom sqlalchemy.ext.declarative import declarative_basefrom 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()
コードの解説
Section titled “コードの解説”-
データベースのURL設定
SQLALCHEMY_DATABASE_URL = "sqlite:///./todo.db"- SQLite データベースのファイルパスを指定します
./todo.db
はサーバを起動したディレクトリにtodo.db
というファイルを作成します
-
データベースエンジンの作成
engine = create_engine(SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False})- SQLAlchemyのエンジンを作成します
- エンジンはサーバからデータベースへのすべての接続などを管理します
check_same_thread=False
は、複数のスレッドからデータベースにアクセスできるようにします
-
セッションの作成
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)- データベースセッションを作成するためのファクトリを定義します
- セッションはエンジンが管理している接続情報を使ってデータベースに接続し、取得したデータをPythonのオブジェクトに変換する処理などを担当します
-
モデルのベースクラス
Base = declarative_base()- すべてのモデル(データベースのテーブルをPythonのクラスとして表現したもの)の基底クラスを作成します
- このクラスを継承して、データベースのテーブルを定義します
-
データベースセッションを取得する関数
def get_db():db = SessionLocal()try:yield dbfinally:db.close()- データベースセッションを取得するための関数です
yield
を使用して、セッションを自動的に閉じるようにしています
Todoモデルの作成
Section titled “Todoモデルの作成”次に、Todoのデータモデルを作成します。todo-api/app/models.py
を以下のように編集します:
from sqlalchemy import Column, Integer, String, Booleanfrom .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)
コードの解説
Section titled “コードの解説”-
テーブル名の定義
__tablename__ = "todos"- データベースのテーブル名を
todos
に設定します
- データベースのテーブル名を
-
カラムの定義
id = Column(Integer, primary_key=True, index=True)title = Column(String, index=True)completed = Column(Boolean, default=False)id
: Todoの一意の識別子(主キー)title
: Todoのタイトル(インデックス付き)completed
: 完了状態(デフォルトはFalse)
データベースの初期化
Section titled “データベースの初期化”データベースとテーブルを作成するために、todo-api/app/main.py
を以下のように更新します:
from fastapi import FastAPIfrom . import modelsfrom .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} ]
🚀 動作確認
Section titled “🚀 動作確認”-
サーバーを再起動します:
Terminal window uvicorn app.main:app --reload -
データベースファイル(
todo-api/todo.db
)が作成されたことを確認します:
🎯 理解度チェック
Section titled “🎯 理解度チェック”以下の質問に答えて、学習内容を確認しましょう!
-
SQLAlchemyでモデルを定義する際の正しい書き方は?
- A:
class Todo(Base):
- B:
class Todo(models.Model):
- C:
class Todo(database.Model):
- A:
答えを見る
答え: A: class Todo(Base):
- SQLAlchemyでは、
Base
クラスを継承してモデルを定義します Base
はdeclarative_base()
で作成した基底クラスです- 参考: SQLAlchemy公式ドキュメント
このステップでは以下について学びました。
-
データベースの基本
- データベースURLの設定
- データベースエンジンの作成
- セッションの管理
-
モデルの定義
- テーブルの定義
- カラムの定義