エミ眠太の自由帳
 エミ眠太の自由帳
    
 
 基本      2023-08-05      2023-09-10

HerokuのDB操作いろいろ

Language:
 SQL
Framework/Library:
Technology:
 CSV DB RDBMS
Platform/Tool:
 ターミナル PostgreSQL Heroku Postgres

記事一覧へ

目次


はじめに

以前からHerokuに関する記事をいくつか作成していますが、今回は諸般の事情でDBのテーブルを削除する作業が発生しました。誤って消すと面倒なのでDBは必要に応じてしか触ったことがなかったのですが、せっかくの機会なので色々な操作を学び直してみました。

Heroku Postgres

Herokuが公式にサポートしているDBは「Heroku Postgres」というHerokuのプラットフォーム上で動くPostgreSQLだけなので、その前提でDBを操作していきます。Heroku Postgresは、Heroku SchedulerやCloudinaryと同様にadd-onsから追加可能です。追加後、環境変数には自動でPostgreSQLのURLが追加されます。

操作

今回はDB操作だけでなく、Heroku CLI操作の基本も含めてまとめていきます。順序としては、ログイン〜DB情報表示〜DBバックアップの表示・作成〜DBバックアップのダウンロード〜DBテーブルのエクスポート・削除という流れで説明していきます。

Herokuログイン〜DB情報表示

heroku loginでログイン後、まずはheroku pg:infoでDBの情報を確認しましょう。一部、数字をいじっていますが、こんな感じで表示されていると思います。

DBバックアップ表示

続いてバックアップ関連情報一覧の表示です。heroku pg:backupsから確認できます。利用できる機能は以下の通りです。

  • === Backups・・・バックアップの作成履歴
  • === Restores・・・バックアップのリストア履歴
  • === Copies・・・バックアップのコピー履歴

バックアップの作成・リストアは実施履歴がないので、実施日時には何も表示されません。3行目の通り、バックアップ作成のためにcaptureを利用しましょう。

DBバックアップ〜ダウンロード

それではheroku pg:backups:captureでバックアップを作成します。8行目のように、b002というIDでバックアップが作成されたというメッセージが出ています。バックアップ作成後、再度heroku pg:backupsでバックアップ情報を確認すると、=== Backupsの欄に先ほどのIDが表示されていることが分かりますね。また同じテーブルに実施日時が表示されていますが、クソデカデータではないので2秒ぐらいで完了しているようです。

その後、heroku pg:backups:downloadで作成したバックアップをダウンロードします。コマンド実行後、デフォルトではコマンド実行時と同じ階層で、latest.dumpという名前のファイルでダウンロードされます。

DBエクスポート(CSVファイル)

上の章ではDB自体のダウンロードをしましたが、こちらではより実践的にDB内のテーブルをCSVにエクスポートしてみます。 エクスポートする前に、CSVに落としたいデータがどのテーブル内にあるか確認しましょう。エクスポートしたいテーブルはsample_groupテーブルに入っていそうです。 ※なお今回は使用しませんが、SQLコマンドを操作するためにはheroku pg:psqlの他に、$ heroku configでHerokuで設定済みの環境変数を表示しDATABASE_URLの値を取得した後、$ psql [DATABASE_URL]でDBにアクセスする方法もあります。

「一行解説」を見る
  1. (l.1) まずはheroku pg:psqlでDBをSQLコマンドで操作できるようにします。今回はpsqlの後に、[App Name]と同時に-cを加えることでDBと接続させます。さらに、"\d"を追記することでデータベース内の全テーブルを表示します。
  2. (l.10) (4 rows)とあるように、このDB内に4つのテーブルがあることが分かりました。エクスポートしたいテーブルはsample_groupテーブルに入っていそうです。※ なお今回は使用しませんが、SQLコマンドを操作するためにはheroku pg:psqlの他に、$ heroku configでHerokuで設定済みの環境変数を表示しDATABASE_URLの値を取得した後、$ psql [DATABASE_URL]でDBにアクセスする方法もあります。
  3. (l.12) 続いてエクスポートを実施します。(l.1) 同様にheroku pg:psqlでSQLコマンドを操作できるようにします。
  4. (l.18) すると今度は[App Name]::DATABASE=>と表示されSQLが書けるようになります。ここで\copyを使ってテーブルを全選択した状態で最後にHEADERを加え列名が入った形でCSV出力を指示しましょう。コマンド実行時と同じ階層でsample.csvが作られているはずなのでこれで完了です。
  5. (l.19) COPY 10は、列名含めて10行のデータが存在することを示しています。

列を指定してエクスポートする

今回は(l.18) の通りSELECT * FROM public.sample_groupとしているのでテーブルがそのまま出力されてしまっていますが、先ほど出力したsample.csvを見るとplayerという名前の列があることが分かりました。そこで、*として全列を選択している部分についてplayerに変更して改めてCSVエクスポートを実行するとplayer列の全値が出力できます。また同時にWHERE句を使えば、列内で条件に合った値のみを出力可能です。このあたりは一般的なSQLの構文ですので、こちらの記事を参考にしてもらうと分かりやすいと思います。

Heroku Dataclipsを使用する場合

またCSVにエクスポートするだけならHerokuの「Dataclips」を使ってみても良いと思います。 詳しくは下の記事を参考にしてみてください。

DBテーブル削除

バックアップ作成+CSVエクスポートの両方が完了したので最後にテーブルを削除します。

上のコマンドを実行するだけですが、その際ERROR: cannot drop table sample_group because other objects depend on itというエラーが出ることがあります。これは、他のテーブルを参照しているために発生するエラーですので、関連するテーブルを削除する必要があります。問題なく任意のテーブルが消せていたら、再度DROPするとERROR: table "sample_group" does not exist(=対象のテーブルが削除できたため)というエラーが出るはずですので、これで完了です。

まとめ

DB削除は注意しましょう。バックアップだけは忘れないように実施しておきましょう。

参考


記事をシェアする


関連する記事

よろしければこちらの記事も参考にしてみてください。

Loading...




記事一覧へ