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

## 20200601追記: なんで接続設定してないのにHerokuでDBに接続しているの？

時々みなさんに見ていただいているので、わたしも当初疑問だったことについて追記しておきます。
（この記事はRailsを対象にして書いていますので、ご了承ください）

「Herokuにコードをpushするときは、productionモードで起動するのはわかるんだけど **特にproduction modeでのdatabase.ymlの設定は入れていなかった**のに、 PostgreSQLに接続している。なぜ？？」

実際は、環境変数``DATABASE_URL``に接続先が指定されていれば、その設定を利用するようになるんですね💦
この記事のところでは触れていませんが、Herokuのアプリケーションの設定で、「DATABASE_URL」が環境変数として設定されているのが確認できると思います。

**Rails Guide (日本語)から**

 - [データベースを設定する](https://railsguides.jp/configuring.html#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B)

> ほぼすべてのRailsアプリケーションは、何らかの形でデータベースにアクセスします。データベースへの接続は、環境変数ENV['DATABASE_URL']を設定するか、config/database.ymlというファイルを設定することで行えます。(Rails Guide: 「データベースを設定する」から引用)

**ソースコードから**

- https://github.com/rails/rails/blob/e803ab6e80e2fc0b772e2135ce85111cdce23e2f/railties/lib/rails/application/configuration.rb#L259-L263


## はじめに

[Railsのチュートリアル](https://railstutorial.jp)でも、RailsのSaaSとして[Heroku](https://www.heroku.com)が出てきますね。
今回は、そのHerokuにデプロイしたアプリケーションではなくて、割り当たったPostgreSQLについて眺めてみます。

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

※PostgreSQL以外にも無料枠から使えるDBは色々あります: [Heroku Addons](https://elements.heroku.com/addons)

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

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

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

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

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

- Herokuのアプリケーションに割り当たったDBを確認する
- アプリケーションに割り当たったDBにHeroku CLIから接続する
- 上記DBに、データベース用クライアントから接続する


以下は扱いません。

- Herokuそのものの説明
- Railsに関しての説明

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

- ローカルでの作業にはMacを利用
- Heroku CLIをインストール済み (20170922時点のものです）

```console
$ 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 から取得できます。
![heroku-db-setting.png](https://qiita-image-store.s3.amazonaws.com/0/27976/7a9ef11f-01a5-c06f-ca07-a890da56fbd7.png "heroku-db-setting.png")


このDBに対しては、Heroku側のアプリケーションとの間だけでなく、直接DBに接続しに行くこともできます。
あとで紹介する、DB用のツールから接続する場合に、この情報を利用します。


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

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

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

```console
$ 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にアクセスすることが出来ます。

![sample-heroku-command.png](https://qiita-image-store.s3.amazonaws.com/0/27976/c2bdd359-c47c-2267-174e-8b41f8b0114c.png "sample-heroku-command.png")

### heroku pg:psql の例

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

heroku pg:psql -c "\d"

結果はこちら。

```console
 $ 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側ではなく、ちゃんとローカルのディレクトリに書き出しになります）


```console
$ 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での接続例です。

![connect-to-heroku-db.png](https://qiita-image-store.s3.amazonaws.com/0/27976/eaec3542-f3a9-7032-15c9-d06480306556.png "connect-to-heroku-db.png")

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

ささっとデータを確認したり、railsのコードのようにモデルを通してデータをチェックするような場合は、rails consoleを使うこともできます。
（もちろん、簡単な更新も可能です）

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

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


![rails-console-on-heroku-web.png](https://qiita-image-store.s3.amazonaws.com/0/27976/d32adbdc-d5f2-cec7-51df-bfa1002049d1.png "rails-console-on-heroku-web.png")

## まとめ

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