スポンサードリンク



こんにちは。sinyです。

この記事ではDjangoで古いデータベースレコードを削除する方法をご紹介します。

前提

ここでは、「過去6か月以前の古いレコードを自動削除する」といったケースを想定して説明します。

モデルは以下のような定義とします。
※サーバのパフォーマンスデータ(CPU、メモリ)の履歴情報を格納するテーブルという想定。
※Serverモデルの記載は省略しています。

 

上記モデルを対象として、6か月以前の更新日付(update_time)のレコードを対象にデータを削除するという前提で話を進めます。

レコードの削除方法

まず最初にレコードの削除方法ですが、単純にあるテーブルの全レコードを削除したい場合は以下のコマンドでOKです。

 

今回はPerfHistクラステーブルのレコードの中で更新日付(update_time)が現在日付から180日以前のレコードのみ削除したいので、以下のようにobjects.filterを利用します。

<モデルクラス名>.objects.filter(update_time__lte=<180日前の日付>).delete()

現在日付は以下のコードで取得します。

 

180日以前の日付が取得できたので、以下のコードでPerfHistテーブルからupdate_timeが180日以前のレコードをすべて抽出してdelete()メソッドをつけてレコードを削除します。

 

過去6か月以前の古いレコードを削除する」部分は以上で完了です。

レコードを自動削除する方法

今回は、Djangoのカスタムコマンドを使ってレコードの削除処理を実装します。
また、カスタムコマンドの処理結果はログファイル<年月日>-<時刻>_LOTATE_PERF_HIST_PY.logに書き込み、処理でエラーが発生した場合はメール通知させる機能も実装します。

※Djangoカスタムコマンドの初期設定部分の説明は割愛します。

<アプリケーション>\management\commandsフォルダ配下lotate_hist.py(ファイル名は何でもOK)を作成し以下のコードを記載します。

 

ソースコードの概要は以下の通りです。

ログファイルの定義

 

以下のコードで、「20200331-103046_LOTATE_PERF_HIST_PY.log」のようなログファイル名を定義しています。

 

異常時のメール送信メソッドの定義

処理でエラーが発生した場合にメールで検知できるように以下のコードでメール送信メソッドを定義しています。

 

MIMETextsmtplibを利用して上記のようなコードを定義するとメールタイトル(subject)とメール内容(content)を指定のアドレスにメール送信することができます。

メイン処理

カスタムコマンドのメイン処理はhandleメソッド内に定義します。

以下の部分がメイン処理です。

 

既に解説した通り以下のコードで180以前のレコードを削除しています。

 

ログファイルへの書き込みはlogging.info(<ログに書き込みたい内容>で行っています。

また、メイン処理をtry~exceptで囲いexcept内でエラーが発生した場合にエラー内容をログに書き込み、subjectとcontentを設定してsend_mailメソッドの引数に指定してエラーメールを送信します。

最後にsys.exit(1)でカスタムコマンドの処理を異常終了させています。

ちなみに処理が異常終了した場合は以下のようなログが生成されます。

 

あとは、Djangoのカスタムコマンド「python manage.py lotate_hist」をバッチ化してスケジュール実行すれば古いレコードを定期的に自動削除することができます。

色々なやり方があると思いますが、1つの方法として参考にしていただければ幸いです。

以上、「Djangoで古いレコードを自動削除する方法」でした。

 

おすすめの記事