Edited at

HerokuのDBにローカルPCからアクセスしたいんだけど...


はじめに

Railsのチュートリアルでも、RailsのSaaSとしてHerokuが出てきますね。

今回は、そのHerokuにデプロイしたアプリケーションではなくて、割り当たったPostgreSQLについて眺めてみます。

Railsのproduction用のDBとしてPostgreSQLを設定した場合で、専用のDBを用意して接続先を明示しなかった場合、Herokuにデプロイすると、自動でHobby dev(無料プラン)用のPostgreSQLが割り当たります。

※PostgreSQL以外にも無料枠から使えるDBは色々あります: Heroku Addons

チュートリアルにはDB側にはあまり触れられていないのと、Herokuに触れる機会があったので、自分の確認用としてメモを残してみます。


やりたいこと / やらないこと

アプリケーションのデプロイ後、問題なく稼働できていればいいのですが、マイグレーションで失敗したり、不整合を起こしたデータが入ってしまったり...となると、やはり直接DBを見たくなるかなと思います。

頑張ってrails consoleを使ってActiveRecordを通して操作するというのもありですが、データの一覧性に乏しかったりしますので、できれば慣れたDB用のツールも使いたい。

ということで、やりたいことは、以下の通りです。


  • Herokuのアプリケーションに割り当たったDBを確認する

  • アプリケーションに割り当たったDBにHeroku CLIから接続する

  • 上記DBに、データベース用クライアントから接続する

以下は扱いません。


  • Herokuそのものの説明

  • Railsに関しての説明

また、ローカル環境はこちらになります。


  • ローカルでの作業にはMacを利用

  • Heroku CLIをインストール済み (20170922時点のものです)

$ heroku -v

heroku-cli/6.14.25-4fab11b (darwin-x64) node-v8.4.0


Herokuの画面からDB接続情報を取得する(ブラウザでアクセス)

まずは何も用意せずに、HerokuにRailsアプリケーションのソースをpushしたらどうなるか。

pushして問題なくbuild、起動すると、その際にDBが割り当たります。

こちらは、Herokuのアプリケーションの設定画面からチェックできます。

アプリケーションのOverviewから、Heroku Postgresがあればそちらのリンクをクリック。

連携しているPostgreSQLの画面に遷移するので、そちらから確認できます。

接続情報(URLやアカウント、パスワード)は、Settings -> Database Credentials から取得できます。

このDBに対しては、Heroku側のアプリケーションとの間だけでなく、直接DBに接続しに行くこともできます。

あとで紹介する、DB用のツールから接続する場合に、この情報を利用します。


Heroku CLIからDB接続情報を取得する(コマンドラインから)

Herokuのアプリケーションの管理画面からの情報取得だけでなく、HerokuのCLIを使ってheroku login済みであれば、コマンドラインでデータベースの接続情報をチェックすることもできます。

heroku pg:credentials:url というコマンドで表示されます。

$ heroku pg:credentials:url --app アプリケーション名

Connection information for default credential.
Connection info string:
"dbname=xxxxxx host=ec2-xxxxxx.amazonaws.com port=5432 user=xxxxx password=xxxxxx sslmode=require"
Connection URL:
postgres://ユーザ名:パスワード@ホスト名:5432/データベース名

その他にも、DBを操作するためのコマンドがいくつかあります。heroku pg -h で表示されますので、キャプチャを付けてみます。

Hobby tier(無償枠)では利用できない機能もありますが、ローカルでpsqlを使ってPostgreSQLを操作するのと同様に、heroku pg:psql でHeroku側のDBにアクセスすることが出来ます。


heroku pg:psql の例

単純なコマンドで試してみます。

"\d" は、データベース内のテーブルを表示するコマンドです。試しに実行してみます。

heroku pg:psql -c "\d"

結果はこちら。

 $ heroku pg:psql -c "\d"

--> Connecting to 割り当たっているDB

List of relations
Schema | Name | Type | Owner
--------+----------------------+----------+----------------
public | ar_internal_metadata | table | xxxxx
public | microposts | table | xxxxx
public | microposts_id_seq | sequence | xxxxx
public | schema_migrations | table | xxxxx
public | users | table | xxxxx
public | users_id_seq | sequence | xxxxx
(6 rows)

$ heroku pg:psql -c "select * from users;"

--> Connecting to 割り当たっているDB
id | name | email | created_at | updated_at
----+------+-------+------------+------------
(0 rows)


CSVに書き出してみる

基本はpsqlなので、\copyコマンドでCSVに出力ができます。

この例だと、TOで指定したファイルはカレントのディレクトリに書き出されます。(Heroku側ではなく、ちゃんとローカルのディレクトリに書き出しになります)

$ heroku pg:psql -c "\copy (SELECT * FROM users) TO dump.csv WITH CSV HEADER"

--> Connecting to 割り当たっているDB
COPY 1

$ cat dump.csv
id,name,email,created_at,updated_at
1,akiko,akiko@example.com,2017-09-22 13:11:59.935977,2017-09-22 13:11:59.935977


DB用のクライアントツールから接続する

簡単な操作はpsqlでも出来ますが、複雑なSQLでテーブルをjoinしてデータを見たくなる場合は、DBのクライアントツールが使いたくなります。(私の場合)

PostgreSQLの場合は、pgAdminといったGUIツールや、NetBeansやEclipseといった統合開発環境(IDE) を使ってDBに接続、グラフィカルに操作ができます。

だいたいJDBCドライバを利用しての接続ですが、PostgreSQL用のドライバを取得し、URLには heroku db:credentials やHerokuのWebの管理画面から得られた接続用のURLを設定すればOKです。

今回は、IntelliJ IDEAでの接続例です。


番外:Rails consoleからデータを操作する

ささっとデータを確認したり、railsのコードのようにモデルを通してデータをチェックするような場合は、rails consoleを使うこともできます。

(もちろん、簡単な更新も可能です)

rails consoleは heroku run rails console で実行できます。

また、Herokuのアプリケーションの管理画面から、ブラウザを通して rails console の操作を行うことができます。

参考までに、キャプチャを載せておきます。


まとめ

以上、駆け足ですがHerokuの向こう側にあるDBにアクセス、アプリケーションを通さずに直接操作したり、状況を確認する方法についてまとめてみました。