Python | Django | モデルにおけるマイグレーション操作
公開日: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
新しくフォルダ”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', # 追記箇所
]
“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
“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
ターミナルで,"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
“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
ターミナルで,"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)
以上