作成しようとしたきっかけ
何度もデータベースをぶっ壊すようなことをしてきたため、そろそろ自分なりに解決方法をまとめないと忘れるなと思ったので、記事としてまとめます。
データベースを変更してぶっ壊した
あれ、ここのモデル構図違うじゃんとなり、色々とモデルを修正していたらこうなってしまった。
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
[X] 0012_alter_user_first_name_max_length
blog
[X] 0001_initial
[X] 0002_comment
[X] 0003_article_count
[X] 0004_alter_article_options_alter_comment_options_and_more
[X] 0005_alter_articlelike_options_remove_articlelike_count
[X] 0006_alter_articlelike_article
[X] 0007_alter_comment_article_articletag
[X] 0008_remove_articletag_article_article_tags
[X] 0009_alter_articletag_slug
[ ] 0010_alter_article_author #こいつだけXがない!
contenttypes
[X] 0001_initial
[X] 0002_remove_content_type_name
mysite
[X] 0001_initial
[X] 0002_profile
[X] 0003_profile_image
sessions
[X] 0001_initial
やってしまった・・・とほほ
色々試したが初心者の自分では修正が無理そうだったので、もうデータベースごと初期化してしまえ!!!ってなりました。
個人開発なら全然いいのですが、チーム開発や仕事でデータベースを管理している方は今回説明する方法は行わないでください。
データベースを初期化する手順
1.SQLite3データベースに接続
sqlite3 db.sqlite3
2.既存のテーブルを削除
DROP TABLE IF EXISTS django_migrations;
DROP TABLE IF EXISTS django_content_type;
DROP TABLE IF EXISTS auth_permission;
DROP TABLE IF EXISTS auth_group;
DROP TABLE IF EXISTS auth_group_permissions;
DROP TABLE IF EXISTS auth_user;
DROP TABLE IF EXISTS auth_user_groups;
DROP TABLE IF EXISTS auth_user_user_permissions;
DROP TABLE IF EXISTS account_emailaddress;
DROP TABLE IF EXISTS account_emailconfirmation;
DROP TABLE IF EXISTS django_admin_log;
DROP TABLE IF EXISTS django_session;
DROP TABLE IF EXISTS django_site;
DROP TABLE IF EXISTS socialaccount_socialaccount;
DROP TABLE IF EXISTS socialaccount_socialapp;
DROP TABLE IF EXISTS socialaccount_socialapp_sites;
DROP TABLE IF EXISTS socialaccount_socialtoken;
そしたら.exti
でsqlite3から抜け出します。
3.マイグレーションの確認
python3 manage.py showmigrations
## 結果 ##
admin
[ ] 0001_initial
[ ] 0002_logentry_remove_auto_add
[ ] 0003_logentry_add_action_flag_choices
auth
[ ] 0001_initial
[ ] 0002_alter_permission_name_max_length
[ ] 0003_alter_user_email_max_length
[ ] 0004_alter_user_username_opts
[ ] 0005_alter_user_last_login_null
[ ] 0006_require_contenttypes_0002
[ ] 0007_alter_validators_add_error_messages
[ ] 0008_alter_user_username_max_length
[ ] 0009_alter_user_last_name_max_length
[ ] 0010_alter_group_name_max_length
[ ] 0011_update_proxy_permissions
[ ] 0012_alter_user_first_name_max_length
blog
[ ] 0001_initial
[ ] 0002_comment
[ ] 0003_article_count
[ ] 0004_alter_article_options_alter_comment_options_and_more
[ ] 0005_alter_articlelike_options_remove_articlelike_count
[ ] 0006_alter_articlelike_article
[ ] 0007_alter_comment_article_articletag
[ ] 0008_remove_articletag_article_article_tags
[ ] 0009_alter_articletag_slug
[ ] 0010_alter_article_author
[ ] 0011_remove_article_author
contenttypes
[ ] 0001_initial
[ ] 0002_remove_content_type_name
mysite
[ ] 0001_initial
[ ] 0002_profile
[ ] 0003_profile_image
sessions
[ ] 0001_initial
すっからかんになりました笑
db.sqlite3ファイルも削除します。
rm db.sqlite3
次に各アプリそれぞれのmigrationファイルをすべて削除します。
この時に__init__.py
を消さないように注意してください。
消してしまったら再度同じところに作成すればOKです。
以下のコマンドでmigrationファイルを削除していきます。
app名には各アプリケーション名を入れてください。
rm app名/migrations/0*.py
これで各ファイルのmigrationファイルを削除できました。
続いて、adminに関連する箇所をコメントアウトしていきます。
なぜこれが必要かというと、カスタムユーザを作成する前にmigrateすると、すでにあるDjangoのデフォルトのadminユーザのModelとカスタムユーザのModelが衝突を避けるためです。
admin関係をコメントアウトしたらmakemigrations
を実行します。
python manage.py makemigrations
以下のようにadmin以外の部分にX
が付きました。
admin
[ ] 0001_initial
[ ] 0002_logentry_remove_auto_add
[ ] 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
[X] 0012_alter_user_first_name_max_length
blog
[X] 0001_initial
contenttypes
[X] 0001_initial
[X] 0002_remove_content_type_name
mysite
[X] 0001_initial
sessions
[X] 0001_initial
続いてmigrate
を実行します。
python manage.py migrate
adminにもX
が付きました。
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
[X] 0012_alter_user_first_name_max_length
blog
[X] 0001_initial
contenttypes
[X] 0001_initial
[X] 0002_remove_content_type_name
mysite
[X] 0001_initial
sessions
[X] 0001_initial
無事データベースを再起動することができました!!
参考サイト