Python | Django | モデルにおけるマイグレーション操作

2021年6月26日

公開日:2021/6/26

Pythonには,DjangoというWebアプリケーションフレームワークがある.フレームワークのため,Djangoを利用するとWebアプリを通常よりも短時間で開発することが可能になる.

Djangoにおいてモデル(model)を使いながら,マイグレーション(migration)の操作方法を以下6構成にて記す.

1. プロジェクトおよびアプリの作成
2. モデル(model.py)を利用したマイグレーション操作
3. モデル(model.py)を利用した追加のマイグレーション操作
4. マイグレーションの1つを適用から外し,削除するやり方
5. マイグレーションの1つについて内容変更するやり方
6. 全てのマイグレーションを適用から外し,削除するやり方

◆実施環境

Python 3.8.8
Django 3.2.3

  1. プロジェクトおよびアプリの作成

新しくフォルダ”mymodeltest”を作成し,VS Codeから当該フォルダを開く.

フォルダを開くと以下のようになる.

ターミナルを開き,”conda activate 仮想環境名”を実行し,仮想環境に移行する.”mymodeltest”のディレクトリで”django-admin startproject model_project”を実行すると,プロジェクトである"model_project"が以下のように作成される.

“cd model_project"を実行し,カレントディレクトリを"model_project"にする."python manage.py startapp model_app"を実行し,アプリを作成する.アプリの"model_app"が以下のように作成される.

“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 admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK 
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying auth.0012_alter_user_first_name_max_length... OK
Applying sessions.0001_initial... OK

同時にデータベースである"db.splite3″も以下のように作成される.

“model_project/settings.py"の"INSTALLED_APPS"に作成したアプリ名"mode_app"を追加する.追加後,以下のようになる.

INSTALLED_APPS = [
  'django.contrib.admin',
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.messages',
  'django.contrib.staticfiles',
  'model_app', # 追記箇所
]
  1. モデル(model.py)を利用したマイグレーション操作

“model_app/models.py"にclassを追記する."models.py"の内容は以下になる.

from django.db import models

class Cake(models.Model): # 以下追記箇所
  cake_name = models.CharField(max_length=40)
  birthplace = models.CharField(max_length=40)

“models.py"の内容を反映させるため,ターミナルを開き,"python manage.py makemigrations model_app –name add_cake"を実行する.以下がターミナルに出力される.

Migrations for 'model_app':
  model_app\migrations\0001_add_cake.py
    - Create model Cake

同時に"model_app/migrations"に"0001_add_cake.py"が以下のように作成される.

ターミナルで,"python manage.py migrate model_app"を実行する.以下がターミナルに出力される.

Operations to perform:
  Apply all migrations: model_app
Running migrations:
  Applying model_app.0001_add_cake... OK

VS Codeの”View”をクリックし,以下”Command Palette”をクリックする.

“SQLite”を検索し,以下”SQLite: Open Database”を選ぶ.

その後,”db.sqlite3″を選ぶ.

“VS Code”に以下”SQLITE EXPLORER”が追加される.

”SQLITE EXPLORER”をクリックするとテーブルの詳細を確認できる."models.py"に記載した"cake_name"と"birthplace"が作成されていることが分かる.

“db.sqlite3″を右クリックし,「Show Table 'sqlite_master’」をクリックする.

データベースのテーブルの詳細を以下のように確認できる.

ターミナルで,"python manage.py showmigrations model_app"を実行する.以下がターミナルに出力される.

model_app
[X] 0001_add_cake
  1. モデル(model.py)を利用した追加のマイグレーション操作

“model_app/models.py"に追加のクラス(sales_amounts)を記述する.追加後,"models.py"は以下のようになる.

from django.db import models

class Cake(models.Model):
  cake_name = models.CharField(max_length=40)
  birthplace = models.CharField(max_length=40)

class sales_amounts(models.Model): # 以下追記箇所
  amounts = models.IntegerField()

ターミナルで"python manage.py makemigrations model_app –name add_sales_amounts"を実行する.実行するとターミナルに以下が出力される.

Migrations for 'model_app':
  model_app\migrations\0002_add_sales_amounts.py
    - Create model sales_amounts

同時に"model_app/migrations"に"0002_add_sales_amounts.py"が以下のように作成される.

ターミナルで"python manage.py migrate model_app"を実行する.ターミナルが以下のように出力され,"0002_add_sales_amounts.py"が適用される.

Operations to perform:
  Apply all migrations: model_app
Running migrations:
  Applying model_app.0002_add_sales_amounts... OK

“SQLITE EXPLORER"の赤枠の更新ボタンをクリックすると,以下のように"model_app_sales_amounts"が追加された.

ターミナルで,"python manage.py showmigrations model_app"を実行する.以下がターミナルに出力される.

model_app
[X] 0001_add_cake
[X] 0002_add_sales_amounts
  1. マイグレーションの1つを適用から外し,削除するやり方

ターミナルで,"python manage.py migrate model_app 0001_add_cake"を実行する.以下がターミナルに出力される."0002_add_sales_amounts"が適用されなくなる.

Operations to perform:
  Target specific migration: 0001_add_cake, from model_app
Running migrations:
  Rendering model states... DONE
  Unapplying model_app.0002_add_sales_amounts... OK

ターミナルで,"python manage.py showmigrations model_app"を実行する.以下がターミナルに出力される."0002_add_sales_amounts"から"X"が消えていることが分かる.

model_app
[X] 0001_add_cake
[ ] 0002_add_sales_amounts

“SQLITE EXPLORER"の赤枠の更新ボタンをクリックすると,上記で追加された"model_app_sales_amounts"が以下のように消えたのが分かる.

“model_app/migrations"に格納されている以下赤枠の"0002_add_sales_amounts.py"を削除する.

ターミナルで,"python manage.py showmigrations model_app"を実行する.以下がターミナルに出力される."0002_add_sales_amounts"が消えていることが分かる.

model_app
[X] 0001_add_cake
  1. マイグレーションの1つについて内容変更するやり方

“model_app/models.py"に以下2つの変数(“country", “city")を追加する.追加後,"models.py"は以下のようになる.

from django.db import models

class Cake(models.Model):
  cake_name = models.CharField(max_length=40)
  birthplace = models.CharField(max_length=40)

class sales_amounts(models.Model): 
  amounts = models.IntegerField()
  country = models.CharField(max_length=40) # 以下追記箇所
  city = models.CharField(max_length=40)

前回同様に,ターミナルで"python manage.py makemigrations model_app –name add_sales_amounts"を実行する.実行するとターミナルに以下が出力される.

Migrations for 'model_app':
  model_app\migrations\0002_add_sales_amounts.py
    - Create model sales_amounts

前回同様に"model_app/migrations"に"0002_add_sales_amounts.py"が以下のように作成される.

“0002_add_sales_amounts.py"の内容を確認すると,"model_app/models.py"に追加された2つの変数(“country", “city")が以下のように追加されているのが分かる.

from django.db import migrations, models

class Migration(migrations.Migration):

  dependencies = [
    ('model_app', '0001_add_cake'),
  ]

  operations = [
    migrations.CreateModel(
      name='sales_amounts',
      fields=[
        ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
        ('amounts', models.IntegerField()),
        ('country', models.CharField(max_length=40)), # 追記箇所
        ('city', models.CharField(max_length=40)), # 追記箇所
      ],
    ),
  ]

ターミナルで,"python manage.py showmigrations model_app"を実行する.以下がターミナルに出力される."0002_add_sales_amounts"が現れたが"migrate"する前なので"X"がついていない.

model_app
[X] 0001_add_cake
[ ] 0002_add_sales_amounts

“0002_add_sales_amounts"を適用させるため,ターミナルで,"python manage.py migrate model_app"を実行する.以下が出力され,"0002_add_sales_amounts"が適用される.

Operations to perform:
Apply all migrations: model_app
Running migrations:
Applying model_app.0002_add_sales_amounts... OK

“SQLITE EXPLORER"の赤枠の更新ボタンをクリックすると,"model_app_sales_amounts"が再度追加されたのが分かる.

ターミナルで,"python manage.py showmigrations model_app"を実行する.以下がターミナルに出力される."0002_add_sales_amounts"に"X"が付き,適用されたことが分かる.

model_app
[X] 0001_add_cake
[X] 0002_add_sales_amounts
  1. 全てのマイグレーションを適用から外し,削除するやり方

ターミナルで,"python manage.py migrate model_app zero"を実行する.以下が出力される."0001_add_cake"も"0002_add_sales_amounts"も適用されなくなる.

Operations to perform:
Unapply all migrations: model_app
Running migrations:
Rendering model states... DONE
Unapplying model_app.0002_add_sales_amounts... OK
Unapplying model_app.0001_add_cake... OK

ターミナルで,"python manage.py showmigrations model_app"を実行する.以下がターミナルに出力され,"0001_add_cake"からも"0002_add_sales_amounts"からも"X"が消えたことが分かる.

model_app
[ ] 0001_add_cake
[ ] 0002_add_sales_amounts

“SQLITE EXPLORER"の赤枠の更新ボタンをクリックすると,"model_app_cake"も"model_app_sales_amounts"も"db.sqlite3″から消えたのが分かる.

“model_app/migrations"に格納されている以下赤枠の"0001_add_cake.py"と"0002_add_sales_amounts.py"を削除する.

ターミナルで,"python manage.py showmigrations model_app"を実行する.以下がターミナルに出力され,"0001_add_cake"も"0002_add_sales_amounts"も削除された.

model_app
(no migrations)

以上