以前からHerokuに関する記事をいくつか作成していますが、今回は諸般の事情でDBのテーブルを削除する作業が発生しました。誤って消すと面倒なのでDBは必要に応じてしか触ったことがなかったのですが、せっかくの機会なので色々な操作を学び直してみました。
Herokuが公式にサポートしているDBは「Heroku Postgres」というHerokuのプラットフォーム上で動くPostgreSQLだけなので、その前提でDBを操作していきます。Heroku Postgresは、Heroku SchedulerやCloudinaryと同様にadd-onsから追加可能です。追加後、環境変数には自動でPostgreSQLのURLが追加されます。
今回はDB操作だけでなく、Heroku CLI操作の基本も含めてまとめていきます。順序としては、ログイン〜DB情報表示〜DBバックアップの表示・作成〜DBバックアップのダウンロード〜DBテーブルのエクスポート・削除という流れで説明していきます。
heroku login
でログイン後、まずはheroku pg:info
でDBの情報を確認しましょう。一部、数字をいじっていますが、こんな感じで表示されていると思います。
続いてバックアップ関連情報一覧の表示です。heroku pg:backups
から確認できます。利用できる機能は以下の通りです。
=== Backups
・・・バックアップの作成履歴=== Restores
・・・バックアップのリストア履歴=== Copies
・・・バックアップのコピー履歴バックアップの作成・リストアは実施履歴がないので、実施日時には何も表示されません。3行目の通り、バックアップ作成のためにcapture
を利用しましょう。
それではheroku pg:backups:capture
でバックアップを作成します。8行目のように、b002
というIDでバックアップが作成されたというメッセージが出ています。バックアップ作成後、再度heroku pg:backups
でバックアップ情報を確認すると、=== Backups
の欄に先ほどのIDが表示されていることが分かりますね。また同じテーブルに実施日時が表示されていますが、クソデカデータではないので2秒ぐらいで完了しているようです。
その後、heroku pg:backups:download
で作成したバックアップをダウンロードします。コマンド実行後、デフォルトではコマンド実行時と同じ階層で、latest.dump
という名前のファイルでダウンロードされます。
上の章ではDB自体のダウンロードをしましたが、こちらではより実践的にDB内のテーブルをCSVにエクスポートしてみます。
エクスポートする前に、CSVに落としたいデータがどのテーブル内にあるか確認しましょう。エクスポートしたいテーブルはsample_group
テーブルに入っていそうです。
※なお今回は使用しませんが、SQLコマンドを操作するためにはheroku pg:psql
の他に、$ heroku config
でHerokuで設定済みの環境変数を表示しDATABASE_URL
の値を取得した後、$ psql [DATABASE_URL]
でDBにアクセスする方法もあります。
heroku pg:psql
でDBをSQLコマンドで操作できるようにします。今回はpsql
の後に、[App Name]
と同時に-c
を加えることでDBと接続させます。さらに、"\d"
を追記することでデータベース内の全テーブルを表示します。(4 rows)
とあるように、このDB内に4つのテーブルがあることが分かりました。エクスポートしたいテーブルはsample_group
テーブルに入っていそうです。※ なお今回は使用しませんが、SQLコマンドを操作するためにはheroku pg:psql
の他に、$ heroku config
でHerokuで設定済みの環境変数を表示しDATABASE_URL
の値を取得した後、$ psql [DATABASE_URL]
でDBにアクセスする方法もあります。heroku pg:psql
でSQLコマンドを操作できるようにします。[App Name]::DATABASE=>
と表示されSQLが書けるようになります。ここで\copy
を使ってテーブルを全選択した状態で最後にHEADERを加え列名が入った形でCSV出力を指示しましょう。コマンド実行時と同じ階層でsample.csv
が作られているはずなのでこれで完了です。COPY 10
は、列名含めて10行のデータが存在することを示しています。今回は(l.18) の通りSELECT * FROM public.sample_group
としているのでテーブルがそのまま出力されてしまっていますが、先ほど出力したsample.csv
を見るとplayer
という名前の列があることが分かりました。そこで、*
として全列を選択している部分についてplayer
に変更して改めてCSVエクスポートを実行するとplayer
列の全値が出力できます。また同時にWHERE
句を使えば、列内で条件に合った値のみを出力可能です。このあたりは一般的なSQLの構文ですので、こちらの記事を参考にしてもらうと分かりやすいと思います。
またCSVにエクスポートするだけならHerokuの「Dataclips」を使ってみても良いと思います。 詳しくは下の記事を参考にしてみてください。
バックアップ作成+CSVエクスポートの両方が完了したので最後にテーブルを削除します。
上のコマンドを実行するだけですが、その際ERROR: cannot drop table sample_group because other objects depend on it
というエラーが出ることがあります。これは、他のテーブルを参照しているために発生するエラーですので、関連するテーブルを削除する必要があります。問題なく任意のテーブルが消せていたら、再度DROP
するとERROR: table "sample_group" does not exist
(=対象のテーブルが削除できたため)というエラーが出るはずですので、これで完了です。
DB削除は注意しましょう。バックアップだけは忘れないように実施しておきましょう。
よろしければこちらの記事も参考にしてみてください。
Loading...