Python Django 入門トップページ


Django のマイグレーション

  1. 概要と準備
  2. マイグレーションの実行
  3. モデルの作成とマイグレーション
  4. テーブルに列を追加
  5. テストデータの投入
  6. ロールバックとテーブルの再生成
  7. テーブルに再び列を追加

Django のマイグレーション

テーブルに再び列を追加

今度は comments_comment テーブルにすでにテストデータが保存されている状況で,updated_at 列を追加してみます.

models.py を編集して updated_at 列を定義します.日時形式の列であるので default の代わりに auto_now=True を使うことも可能です.

comments/models.py
from django.db import models

# Create your models here.

class Comment(models.Model):
    title = models.CharField(max_length=200)
    body = models.CharField(max_length=1000, default="")
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

マイグレーションファイルを生成します.

(py39) C:\Users\lecture\Documents\django\django_comment>python manage.py makemigrations comments ⏎
Migrations for 'comments':
  comments\migrations\0003_comment_updated_at.py
    - Add field updated_at to comment

(py39) C:\Users\lecture\Documents\django\django_comment>

生成されたマイグレーションファイルの中身を確認します.

comments/migrations/0003_comment_updated_at.py
# Generated by Django 4.0 on 2022-08-01 16:08

from django.db import migrations, models


class Migration(migrations.Migration):

    dependencies = [
        ('comments', '0002_comment_body'),
    ]

    operations = [
        migrations.AddField(
            model_name='comment',
            name='updated_at',
            field=models.DateTimeField(auto_now=True),
        ),
    ]

念の為,マイグレーションの実行状況を確認します.

(py39) C:\Users\lecture\Documents\django\django_comment>python manage.py showmigrations ⏎
admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
 [X] 0003_logentry_add_action_flag_choices
auth
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
 [X] 0003_alter_user_email_max_length
 [X] 0004_alter_user_username_opts
 [X] 0005_alter_user_last_login_null
 [X] 0006_require_contenttypes_0002
 [X] 0007_alter_validators_add_error_messages
 [X] 0008_alter_user_username_max_length
 [X] 0009_alter_user_last_name_max_length
 [X] 0010_alter_group_name_max_length
 [X] 0011_update_proxy_permissions
 [X] 0012_alter_user_first_name_max_length
comments
 [X] 0001_initial
 [X] 0002_comment_body
 [ ] 0003_comment_updated_at
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
sessions
 [X] 0001_initial

(py39) C:\Users\lecture\Documents\django\django_comment>

マイグレーションを実行して,テーブルに列を追加します.

(py39) C:\Users\lecture\Documents\django\django_comment>python manage.py migrate ⏎
Operations to perform:
  Apply all migrations: admin, auth, comments, contenttypes, sessions
Running migrations:
  Applying comments.0003_comment_updated_at... OK

(py39) C:\Users\lecture\Documents\django\django_comment>

実行できたことを確認します.

(py39) C:\Users\lecture\Documents\django\django_comment>python manage.py showmigrations ⏎
admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
 [X] 0003_logentry_add_action_flag_choices
auth
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
 [X] 0003_alter_user_email_max_length
 [X] 0004_alter_user_username_opts
 [X] 0005_alter_user_last_login_null
 [X] 0006_require_contenttypes_0002
 [X] 0007_alter_validators_add_error_messages
 [X] 0008_alter_user_username_max_length
 [X] 0009_alter_user_last_name_max_length
 [X] 0010_alter_group_name_max_length
 [X] 0011_update_proxy_permissions
 [X] 0012_alter_user_first_name_max_length
comments
 [X] 0001_initial
 [X] 0002_comment_body
 [X] 0003_comment_updated_at
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
sessions
 [X] 0001_initial

(py39) C:\Users\lecture\Documents\django\django_comment>

テーブルに列が追加されるとともに,マイグレーションコマンドを実行した日時が updated_at 列に記録されていることを確認してください.

sqlite> select * from comments_comment; ⏎
id|title|created_at|body|updated_at
1|最初のコメント|2022-07-27 11:01:00|コメントの本文|2022-08-01 18:27:39.238835
2|2個目のコメント|2022-07-27 11:02:00|コメントの本文2|2022-08-01 18:27:39.238835
3|<3個目>のコメント|2022-07-27 11:03:00|<h1>コメントの本文3</h1>|2022-08-01 18:27:39.238835
4|4個目のコメント|2022-07-27 11:04:00|コメントの本文4|2022-08-01 18:27:39.238835
5|5個目のコメント|2022-07-27 11:05:00|コメントの本文5|2022-08-01 18:27:39.238835
6|6個目のコメント|2022-07-27 11:06:00|コメントの本文6|2022-08-01 18:27:39.238835
7|7個目のコメント|2022-07-27 11:07:00|コメントの本文7|2022-08-01 18:27:39.238835
8|8個目のコメント|2022-07-27 11:08:00|コメントの本文8|2022-08-01 18:27:39.238835
9|9個目のコメント|2022-07-27 11:09:00|コメントの本文9|2022-08-01 18:27:39.238835
10|10個目のコメント|2022-07-27 11:10:00|コメントの本文10|2022-08-01 18:27:39.238835
sqlite>

この時点で【コメント掲示板の開発】における【テストデータの設定】までとほぼ同じ状態になりました.この続きは【データベースからコメント一覧を取得して表示してみよう】です.

目次に戻る