Djangoで不要になったテーブルを削除する方法

スポンサードリンク



こんにちは。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としてもエラーがない状態になりました。

もっと良い方法などがあれば、問合せサイトTwitterから教えていただけると幸いです。

おすすめの記事