Python
Django
PostgreSQL

Django + PostgreSQLでマイグレーションファイルの適用テストを行う(邪道編)

More than 1 year has passed since last update.

自分向けのDjango + PostgreSQL での操作備忘録
決して正しい方法ではないし、本来は正攻法で対応すべきだけども
こんな方法もありますよということで記述。

なお、手順としての正しさは保証しない。

目的

Djangoでモデルを変更した場合に、
みんなで共有で使っている検証環境で
マイグレーションファイルを適用した後に対応する。

※ もちろん、正攻法としては
https://stackoverflow.com/questions/32123477/django-revert-last-migration
のようにするのが正しいようだ。

とはいえ追加のコードを書いたりするのも面倒だな〜という方のための対応手順。

前提

  • 手順に記述したコマンドがインストール済みかつ実行可能であること。
  • 操作対象のデータベース名はtargetdbとする。

手順概要

  • 対象データベースの退避先データベースを準備する
  • 既存のセッションを切断する
  • 対象データベースをバックアップする
  • マイグレーションを適用する
  • バックアップから元に戻す

手順

対象データベースの退避先データべースを準備する

退避先データベースの準備
$ createdb targetdb_evate;

既存のセッションを切断

PostgreSQLに接続しているセッションを切断する。
(もちろん操作などが行われていないことを確認の上で)

既存セッションの確認
$ psql
postgres=# select pid, datname from pg_stat_activity;

上のコマンドで確認したpidを指定して以下のSQLを投げる。

セッションの切断
postgres=# select pg_terminate_backend($pid) from pg_stat_activity;

※ $pidには 既存セッションの確認 で確認したpidを入力する。

対象データベースをバックアップする

対象データベース(targetdb)から退避先データベース(targetdb_evade)
にデータをバックアップする。

データベースのバックアップ
$ pg_dump -Ft targetdb | pg_restore -d targetdb_evade

セッションが残っているとここで失敗する。

マイグレーションを適用する

適当な方法でDjangoのマイグレーションを適用する。

マイグレーションの適用
$ python manage.py migrate

適用後動作確認やら各種テストを実行する。

バックアップから元に戻す

退避先データベースから、マイグレーション前の状態に戻す
既存のセッションを切断 の手順を再度実施し、
セッションを全て切断する。

マイグレーション適用済みのデータベース(targetdb)を削除し、
退避していたデータベース(targetdb_evade)をリネームすれば完了。

バックアップからの戻し
$ psql
postgres=# drop database targetdb;
postgres=# alter database targetdb_evade rename to targetdb;