以前の投稿で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'
- name = varchar(32)
- age = int(11)
- created_at = datetime (データ作成時に自動で入る)
- 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`テーブルがあることが確認できます。またスキーマも意図したものができています。
完了