ORM

Django ORMのデータベース作成入門|マイグレーションの基本

Django ORM データベース

Django ORMのデータベース作成入門
マイグレーションの基本

DjangoのORMを使ったデータベース作成とマイグレーションの仕組みを解説します。

こんな人向けの記事です

  • Djangoでデータベースを作成したい人
  • マイグレーションの仕組みを理解したい人
  • データベース設定の変更方法を知りたい人

Step 1デフォルトのデータベース

Djangoプロジェクトの新規作成時、デフォルトではSQLite3が使用されます。SQLite3はファイルベースのデータベースで、追加のインストールが不要なため、開発用途に最適です。

settings.pyのデフォルト設定は以下の通りです。

settings.py
DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.sqlite3",
        "NAME": BASE_DIR / "db.sqlite3",
    }
}

この設定により、プロジェクト直下にdb.sqlite3というデータベースファイルが作成されます。

Step 2マイグレーションの実行

Djangoでデータベースのテーブルを作成するには、マイグレーションを実行します。初回は以下のコマンドを順番に実行します。

ターミナル
python manage.py migrate
実行結果
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying sessions.0001_initial... OK

このコマンドを実行すると、Djangoが標準で持っている認証やセッションなどのテーブルが自動的に作成されます。

ポイント: migrateコマンドはまだ適用されていないマイグレーションファイルをすべて実行します。どのマイグレーションが適用済みかはデータベース内で管理されています。

Step 3データベース設定の変更

本格的な開発やチーム開発では、PostgreSQLやMySQLなどのデータベースに切り替えることが一般的です。

PostgreSQLの設定例:

settings.py
DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.postgresql",
        "NAME": "myapp_db",
        "USER": "myuser",
        "PASSWORD": "mypassword",
        "HOST": "localhost",
        "PORT": "5432",
    }
}

MySQLの設定例:

settings.py
DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.mysql",
        "NAME": "myapp_db",
        "USER": "myuser",
        "PASSWORD": "mypassword",
        "HOST": "localhost",
        "PORT": "3306",
    }
}

注意: PostgreSQLを使用する場合はpsycopg2、MySQLの場合はmysqlclientパッケージのインストールが必要です。pip install psycopg2-binaryなどで事前にインストールしてください。

Step 4データベース管理コマンド一覧

Djangoにはデータベース管理のための便利なコマンドが用意されています。

ターミナル
# マイグレーションファイルを作成
python manage.py makemigrations

# マイグレーションを実行してテーブルを作成・更新
python manage.py migrate

# マイグレーション状態を確認
python manage.py showmigrations

# マイグレーションで実行されるSQLを確認
python manage.py sqlmigrate アプリ名 マイグレーション番号

# データベースをリセット(全データ削除)
python manage.py flush
コマンド説明
makemigrationsモデルの変更からマイグレーションファイルを生成
migrate未適用のマイグレーションを実行
showmigrationsマイグレーションの適用状況を一覧表示
sqlmigrateマイグレーションで実行されるSQLを表示
flushデータベースの全データを削除(テーブル構造は残る)

Step 5本番環境での注意点

本番環境では、以下の点に注意してください。

  • SQLite3は同時アクセスに弱いため、PostgreSQLやMySQLを使用する
  • データベースのパスワードなどの機密情報は環境変数で管理する
  • flushコマンドは全データを削除するため、本番環境では使用しない
settings.py
import os

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.postgresql",
        "NAME": os.environ.get("DB_NAME"),
        "USER": os.environ.get("DB_USER"),
        "PASSWORD": os.environ.get("DB_PASSWORD"),
        "HOST": os.environ.get("DB_HOST", "localhost"),
        "PORT": os.environ.get("DB_PORT", "5432"),
    }
}

ポイント: 環境変数の管理にはpython-decoupledjango-environパッケージを使うと便利です。.envファイルに設定値を記述し、Gitには含めないようにしましょう。

まとめ

  • Djangoはデフォルトでsettings.pyにSQLite3のデータベース設定が記述されている
  • python manage.py migrateでマイグレーションを実行してテーブルを作成する
  • PostgreSQLやMySQLへの切り替えはsettings.pyのDATABASES設定を変更する
  • makemigrationsmigrateの2ステップでデータベースを更新する
  • 本番環境では機密情報を環境変数で管理し、SQLite3以外のDBを使用する