以前の投稿でDjango + MySQLの設定ができたので、今回はテーブルを作成してみようと思います。前回作った sampleのmodels.pyを使います。

models.py

Djangoではこの models.py にテーブル定義を書いていきます。このテーブル定義がDBに流し込まれテーブル操作が可能になります。ここでは `users` ということテーブルを作っていきます。

from django.db import models class User(models.Model): name = models.CharField(max_length=32) # 1 age = models.IntegerField() # 2 created_at = models.DateTimeField(auto_now_add=True) # 3 updated_at = models.DateTimeField(auto_now=True) # 4 class Meta: db_table = 'users'
  1. name = varchar(32)
  2. age = int(11)
  3. created_at = datetime (データ作成時に自動で入る)
  4. update_at = datetime(データ作成時と更新時に自動で入る)

さて、マイグレーションファイルができたのでMySQLに反映してみましょう。

No changes detected

$ python manage.py makemigrations No changes detected

変更点がない、と怒られてしまいました。そこでマイグレーション状態を見ることにします。

$ 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 contenttypes [X] 0001_initial [X] 0002_remove_content_type_name sessions [X] 0001_initial

`sample` が入っていません!!

まずsampleを登録

まずは `sample` を認識するようにしなくてはいけません。

$ python manage.py makemigrations sample

このように sample を明示的に指定することで登録できます。再度 `showmigration`を見てみます。

$ 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 contenttypes [X] 0001_initial [X] 0002_remove_content_type_name sample [ ] 0001_initial sessions [X] 0001_initial

`sample`が出てきました!!

migrate実行

$ python manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, sample, sessions Running migrations: Applying sample.0001_initial... OK

何やらうまくいった感じがします。

テーブル確認

本当にテーブルが作成されているか確認してみましょう。

mysql> show tables; +----------------------------+ | Tables_in_tw_app | +----------------------------+ | auth_group | | auth_group_permissions | | auth_permission | | auth_user | | auth_user_groups | | auth_user_user_permissions | | django_admin_log | | django_content_type | | django_migrations | | django_session | | users | +----------------------------+ 11 rows in set (0.00 sec) mysql> DESC users; +------------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(32) | NO | | NULL | | | age | int(11) | NO | | NULL | | | created_at | datetime(6) | NO | | NULL | | | updated_at | datetime(6) | NO | | NULL | | +------------+-------------+------+-----+---------+----------------+ 5 rows in set (0.00 sec)
Code language: PHP (php)

`users`テーブルがあることが確認できます。またスキーマも意図したものができています。

完了

By user