Help us understand the problem. What is going on with this article?

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

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 から取得できます。
heroku-db-setting.png

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

sample-heroku-command.png

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

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

まとめ

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

akiko-pusu
コツコツと学習しながらのメモを書いています。Redmineのプラグイン開発に関連するものが多めです。記事にご興味を持っていただけたら嬉しいです!
https://daily-postit.hatenablog.com
crowdworks
21世紀の新しいワークスタイルを提供する日本最大級のクラウドソーシング「クラウドワークス」のエンジニアチームです!
https://crowdworks.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした