みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

Heroku のデータベースのプランを変更する

Heroku postgresのデータベースのプランを変更する方法は以下のドキュメントにとても詳しく記載されているのですが,少し困ったことがあったので整理してみます.

Upgrading the Version of a Heroku Postgres Database | Heroku Dev Center

上記の記事を補足する形で説明します.

この記事で実行する操作は,今までprovisionしていたデータベースAをpg:copyコマンドで新しいデータベースBに複製して,データベースBを利用できるようにすることです.

環境変数 DATABASE_URLを変更できない

AppがprovisionしているデータベースAが存在するために,DATABASE_URLを変更しようとするとエラーになります.

f:id:atsuhiro-me:20200805211148p:plain:w360

Cannot overwrite attachment values DATABASE_URL

Herokuとしては,attachmentの環境変数を勝手に変更されたら困るようです.

上記はHerokuの管理画面で操作しています.Heroku CLIでも試し,同様のエラーが発生しました.

このエラーに遭遇した人は複数いらっしゃるようです.

しかし,いずれの解決策もデータベースAを先に削除するなど心臓に悪い方法を使っています.

みーは自分が作成したアプリーケーションで,データベースの参照先を格納する環境変数の名前をDATABASE_URLからDB_URLなどと別の名前に変更し,新たにHerokuの環境変数に設定することで回避しました.

Python, Djangoでdj-database-urlを使用しているならば,

import dj_database_url
dj_database_url.config()

というデフォルトでDATABASE_URLを読み込む関数を,

import os
import dj_database_url
dj_database_url.parse(os.environ["DB_URL"])

という関数に書き換えます.

最後に,DB_URLを利用してアプリケーションがうまく動作することと,データベースがコピーされていることを合わせて確認して,完了です.

少し変則的な操作をする必要はありましたが,実質1つのコマンドpg:copyでデータベースを複製できるHeroku postgresはやはり便利だと思いました.