Breaking News

Default Placeholder Default Placeholder

以前の投稿で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)

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

完了