マイグレーションの実行
これで、カスタムユーザのモデルが定義できました。manage.py
があるディレクトリにいることを確認したうえで、下記のコマンドを実行し、マイグレーションファイルを作成します。データベースに接続するユーザは、データベース環境の構築で作成したユーザrsl
を設定します。【パスワード】には、ユーザrsl
でデータベースに接続するためのパスワードを入力してください。
(venv_recsys_django) $ export DB_USER=rsl
(venv_recsys_django) $ export DB_PASSWORD=【パスワード】
(venv_recsys_django) $ python manage.py makemigrations accounts
Migrations for 'accounts':
accounts/migrations/0001_initial.py
- Create model CustomUser
recsys_django/accounts/migrations/
ディレクトリに0001_initial.py
が作成されました。この時点ではまだマイグレーションは実行されていません。マイグレーションを実行することで、このマイグレーションファイルの内容がデータベースに適用されることになります。下記のコマンドでマイグレーションが実行する内容を確認してみましょう。
(venv_recsys_django) $ python manage.py sqlmigrate accounts 0001
BEGIN;
--
-- Create model CustomUser
--
CREATE TABLE "accounts_customuser" ("id" bigint NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY, "password" varchar(128) NOT NULL, "last_login" timestamp with time zone NULL, "is_superuser" boolean NOT NULL, "username" varchar(150) NOT NULL UNIQUE, "first_name" varchar(150) NOT NULL, "last_name" varchar(150) NOT NULL, "email" varchar(254) NOT NULL, "is_staff" boolean NOT NULL, "is_active" boolean NOT NULL, "date_joined" timestamp with time zone NOT NULL);
CREATE TABLE "accounts_customuser_groups" ("id" bigint NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY, "customuser_id" bigint NOT NULL, "group_id" integer NOT NULL);
CREATE TABLE "accounts_customuser_user_permissions" ("id" bigint NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY, "customuser_id" bigint NOT NULL, "permission_id" integer NOT NULL);
CREATE INDEX "accounts_customuser_username_722f3555_like" ON "accounts_customuser" ("username" varchar_pattern_ops);
ALTER TABLE "accounts_customuser_groups" ADD CONSTRAINT "accounts_customuser_groups_customuser_id_group_id_c074bdcb_uniq" UNIQUE ("customuser_id", "group_id");
ALTER TABLE "accounts_customuser_groups" ADD CONSTRAINT "accounts_customuser__customuser_id_bc55088e_fk_accounts_" FOREIGN KEY ("customuser_id") REFERENCES "accounts_customuser" ("id") DEFERRABLE INITIALLY DEFERRED;
ALTER TABLE "accounts_customuser_groups" ADD CONSTRAINT "accounts_customuser_groups_group_id_86ba5f9e_fk_auth_group_id" FOREIGN KEY ("group_id") REFERENCES "auth_group" ("id") DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX "accounts_customuser_groups_customuser_id_bc55088e" ON "accounts_customuser_groups" ("customuser_id");
CREATE INDEX "accounts_customuser_groups_group_id_86ba5f9e" ON "accounts_customuser_groups" ("group_id");
ALTER TABLE "accounts_customuser_user_permissions" ADD CONSTRAINT "accounts_customuser_user_customuser_id_permission_9632a709_uniq" UNIQUE ("customuser_id", "permission_id");
ALTER TABLE "accounts_customuser_user_permissions" ADD CONSTRAINT "accounts_customuser__customuser_id_0deaefae_fk_accounts_" FOREIGN KEY ("customuser_id") REFERENCES "accounts_customuser" ("id") DEFERRABLE INITIALLY DEFERRED;
ALTER TABLE "accounts_customuser_user_permissions" ADD CONSTRAINT "accounts_customuser__permission_id_aea3d0e5_fk_auth_perm" FOREIGN KEY ("permission_id") REFERENCES "auth_permission" ("id") DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX "accounts_customuser_user_permissions_customuser_id_0deaefae" ON "accounts_customuser_user_permissions" ("customuser_id");
CREATE INDEX "accounts_customuser_user_permissions_permission_id_aea3d0e5" ON "accounts_customuser_user_permissions" ("permission_id");
COMMIT;
このようにSQLが出力されました。マイグレーションはこのSQLを実行するということになります。では、マイグレーションを実行してみましょう。下記のコマンドを実行してください。
(venv_recsys_django) $ python manage.py migrate
Operations to perform:
Apply all migrations: accounts, admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0001_initial... 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 accounts.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 sessions.0001_initial... OK
PostgreSQL上で下記のコマンドを実行してください。
recsys_django=# \dt
すると、
List of relations
Schema | Name | Type | Owner
--------+--------------------------------------+-------+-------
public | accounts_customuser | table | rsl
public | accounts_customuser_groups | table | rsl
public | accounts_customuser_user_permissions | table | rsl
public | auth_group | table | rsl
public | auth_group_permissions | table | rsl
public | auth_permission | table | rsl
public | django_admin_log | table | rsl
public | django_content_type | table | rsl
public | django_migrations | table | rsl
public | django_session | table | rsl
(10 rows)
このように自動的にテーブルが作成されていることが確認できました。
先に入力したコマンドはマイグレーションを実行するためのコマンドです。マイグレーションを実行することで、設定ファイルおよびモデルの定義から、自動的にテーブルを作成したり、変更したりしてくれます。現時点では、ユーザモデルの定義だけしか行っていませんが、それでも既にこれだけのテーブルが自動作成されました。
マイグレーションの詳細については、文献[1]を参照してください。
参考
- 現場で使える Django の教科書《基礎編》 # 第11章 データベースのマイグレーション