20200601追記: なんで接続設定してないのにHerokuでDBに接続しているの?
時々みなさんに見ていただいているので、わたしも当初疑問だったことについて追記しておきます。
(この記事はRailsを対象にして書いていますので、ご了承ください)
「Herokuにコードをpushするときは、productionモードで起動するのはわかるんだけど 特にproduction modeでのdatabase.ymlの設定は入れていなかったのに、 PostgreSQLに接続している。なぜ??」
実際は、環境変数DATABASE_URL
に接続先が指定されていれば、その設定を利用するようになるんですね💦
この記事のところでは触れていませんが、Herokuのアプリケーションの設定で、「DATABASE_URL」が環境変数として設定されているのが確認できると思います。
Rails Guide (日本語)から
ほぼすべてのRailsアプリケーションは、何らかの形でデータベースにアクセスします。データベースへの接続は、環境変数ENV['DATABASE_URL']を設定するか、config/database.ymlというファイルを設定することで行えます。(Rails Guide: 「データベースを設定する」から引用)
ソースコードから
はじめに
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にアクセス、アプリケーションを通さずに直接操作したり、状況を確認する方法についてまとめてみました。