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