This request has already been treated.

  1. alt

    シンタックスハイライト

    alt
Changes in body
Source | HTML | Preview
@@ -1,157 +1,155 @@
## はじめに
[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にアクセス、アプリケーションを通さずに直接操作したり、状況を確認する方法についてまとめてみました。