
目次
はじめに
Heroku 上の PostgreSQL からローカルの PostgreSQL へ、またその逆にローカルから Heroku へ PostgreSQL 間でデータをコピーできると、デプロイ時にとても助かります。Heroku CLI にはそのためのコマンドが用意されていますのでまとめてみました。
ここでは、下記パラメータを使うものとします。
Heroku 上でのアプリケーション名 | appname |
ローカルの PostgreSQL ユーザ名 | pguser |
上記ユーザのパスワード | password |
ローカルで一時的に使用するデータベース名 | mylocaldb |
Heroku → ローカル
Heroku の PostgreSQL からローカルの PostgreSQL にデータをコピーするには、下記コマンドを使います。
$ PGUSER=pguser PGPASSWORD=pasword heroku pg:pull DATABASE_URL mylocaldb --app appname
注意ここで、mylocaldb は空でないとエラーが発生します。(誤ってデータ削除するのを防止するため。)
ローカルのデータベースは下記コマンドで削除できます。
$ dropdb mylocaldb
ローカル → Heroku
ローカルの PostgreSQL から Heroku の PostgreSQL にデータをコピーするには、下記コマンドを使います。
$ PGUSER=pguser PGPASSWORD=pasword heroku pg:push mylocaldb DATABASE_URL --app appname
注意ここで、Heroku 上の PostgreSQL データベース は空でないとエラーが発生します。(誤ってデータ削除するのを防止するため。)
Heroku 上のデータベースは下記コマンドで削除できます。
$ heroku pg:reset --app appname
コマンドを実行すると確認のため、アプリケーション名の入力を求められますので、appname を改めて入力します。
なお、管理人の実行環境では、上記 push コマンドで、一部エラーが発生しました。
・ ・ pg_restore: [archiver (db)] Error while PROCESSING TOC: pg_restore: [archiver (db)] Error from TOC entry 3079; 0 0 COMMENT EXTENSION plpgsql pg_restore: [archiver (db)] could not execute query: ERROR: must be owner of extension plpgsql Command was: COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; ・ ・ WARNING: errors ignored on restore: 1
このエラーは実害は無いので無視して良いようです。(pg:push failing with must be owner of extension plpgsql · Issue #55 · heroku/heroku-pg-extras · GitHub)