こんにちは。sinyです。
この記事では、Django環境でテーブルを削除する際の手順についてまとめました。
実際、実務で開発をしていてテーブルを実装したものの不要になったのですが、テーブルを削除する際の手順がよくわからず試行錯誤して成功した際の手順です。
前提環境
以下のような3つのテーブルクラス(3つのテーブルを作成済み)を実装しているものとし、Userテーブルクラスが不要になったため、Userテーブルを削除するというケースで説明します。
※対象アプリケーション名は「kakeibo」、データベースはSqlite3とします。
from django.db import models from datetime import datetime class Category(models.Model): class Meta: #カテゴリ verbose_name ="カテゴリ" verbose_name_plural ="カテゴリ" #カラム名の定義 category_name = models.CharField(max_length=255,unique=True) def __str__(self): return self.category_name class Kakeibo(models.Model): class Meta: verbose_name ="家計簿" verbose_name_plural ="家計簿" #カラムの定義 date = models.DateField("日付",default=datetime.now) category = models.ForeignKey(Category, on_delete = models.PROTECT, verbose_name="カテゴリ") money = models.IntegerField("金額", help_text="単位は日本円") quantity = models.IntegerField(verbose_name="数量",default=0) memo = models.CharField(verbose_name="メモ", max_length=500) def __str__(self): return self.memo class User(models.Model): class Meta: #カテゴリ verbose_name ="ユーザテーブル" verbose_name_plural ="ユーザテーブル" #カラム名の定義 user_name = models.CharField(max_length=255,unique=True) address = models.CharField(max_length=255,unique=True) def __str__(self): return self.user_name
まずはmakemigrationsコマンドで変更がない状態であることを確認しておきます。
「No changes detected」と表示されればOKです。
python manage.py makemigrations No changes detected
現状のMigrations履歴を確認します。
python manage.py showmigrations ~省略~ kakeibo [X] 0001_initial [X] 0002_auto_20181204_1157 [X] 0003_kakeibo_quantity [X] 0004_user ~省略~
Migrations履歴を削除します。
python manage.py migrate --fake kakeibo zero Operations to perform: Unapply all migrations: kakeibo Running migrations: Rendering model states... DONE Unapplying kakeibo.0004_user... FAKED Unapplying kakeibo.0003_kakeibo_quantity... FAKED Unapplying kakeibo.0002_auto_20181204_1157... FAKED Unapplying kakeibo.0001_initial... FAKED
再度Migrations履歴を確認して[X] →[ ]に変わっていることを確認します。
kakeibo [ ] 0001_initial [ ] 0002_auto_20181204_1157 [ ] 0003_kakeibo_quantity [ ] 0004_user
Migrationsファイルを削除します。
<アプリケーション名>\migrations配下の__init__.py以外のマイグレーションファイル(xxxx.py)を削除します。
再度Migrations履歴を確認して(no migrations)と表示されることを確認します。
python manage.py showmigrations kakeibo (no migrations)
不要になったテーブルを削除します。
今回はSqlite3なので、以下のようにdbshellでデータベース接続した後に「drop table kakeibo_user;」コマンドで不要なテーブルをドロップします。
※他のデータベースの場合は、データベースに対応しているテーブルのDropコマンドを実行すればOK.
python manage.py dbshell SQLite version 3.26.0 2018-12-01 12:34:55 Enter ".help" for usage hints. sqlite> .tables auth_group django_content_type auth_group_permissions django_migrations auth_permission django_session auth_user kakeibo_category auth_user_groups kakeibo_kakeibo auth_user_user_permissions kakeibo_user django_admin_log sqlite> drop table kakeibo_user; sqlite> .tables auth_group django_admin_log auth_group_permissions django_content_type auth_permission django_migrations auth_user django_session auth_user_groups kakeibo_category auth_user_user_permissions kakeibo_kakeibo sqlite>
削除したkakeibo_userテーブルに関する設定をmodels.py、admin.pyなどから削除しておきます。
新たにMigrationsを作成します。
python manage.py makemigrations Migrations for 'kakeibo': kakeibo\migrations\0001_initial.py - Create model Category - Create model Kakeibo
既にデータベースのテーブルは作成されているためfakeコマンドを使ってmigrateを実行します。
python manage.py migrate --fake-initial Operations to perform: Apply all migrations: admin, auth, contenttypes, kakeibo, sessions Running migrations: Applying kakeibo.0001_initial... FAKED
Migrations履歴を確認し、以下のように初期マイグレーションファイル「0001_initial」が生成されていることを確認します。
python manage.py showmigrations ~省略~ kakeibo [X] 0001_initial
対象アプリケーションに対してmakemigrationsを実行し、No changes detectedであることを確認します。
python manage.py makemigrations kakeibo No changes detected in app 'kakeibo'
python manage.py runserverでエラーがなく、アプリケーションに問題なくアクセスできることを確認します。
以上で不要なテーブルの削除が完了し、Djangoとしてもエラーがない状態になりました。