LoginSignup
0
2

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-08-18

自分向けの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;
0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2