Herokuでデータベースに接続する方法と、PostgreSQLでよく使いそうなコマンド(自分用)

Herokuでデータベースを使う方法と、PostgreSQLで使いそうなコマンド(自分用)です。
ローカルにログインする方法を説明したあとにHerokuでの設定を書いていきます。

・ローカルでログインする場合
psql -U postgres -d postgres

まず、ローカル環境にはこれでログインします。
PostgreSQLはインストール済みで、データベースは作成している必要があります。
https://www.postgresql.org/download/

この場合は「postgres」というユーザー名でログインしています。

パスワードを求められるので、入力してログイン。
パスワードを設定していない場合で、例えば「rails_app_development」というデータベースにログインする場合は

psql -d rails_app_development

でログインできます。

HerokuのPostgreSQLにログインする場合
ターミナルでアプリの場所に行き
heroku psql

でログインできます。(設定の詳細はこの記事の最後で説明します)
パスワードは必要ありません。

・データベースの一覧を出す
\l

これでデータベースの一覧が出ます。

ポート名、ホスト名が必要な場合は
psql -l -p ポート番号 -h ホスト名
このようなオプションになります。

・各データベースに接続
\c データベース名;
データベース一覧から選びます。

・テーブル一覧の表示
\dt;

・テーブル構造を表示する
\d テーブル名;

とする。

・テーブルの中身を表示する

select カラム名, カラム名 ... from テーブル名;

とする。どういうことか。

まずテーブル名を確認。
\d テーブル名;
でテーブル構造を確認すると、
テーブル構造の上部に
テーブル "public.users"
のような表示がされるので、その場所を指定する。これがテーブル名。

あとは、表示させたいカラム名を入れれば良い。

例えばusersテーブルの中のidとemailを表示させたい場合は
select id, email from public.users;

というようにする。
select文(SQLコマンド)は;(セミコロン)を忘れないようにする。
セミコロンを忘れた場合は次に正しいコマンドを打ってもエラーになるのでもう一度さらに打つ。

usersテーブルのすべてを表示させたい場合は
select * from public.users;
のようにすればOK。

ちなみに、Heroku上のデータベース(PostgreSQL)ではSQLコマンドは大文字でないとエラーになります。

SELECT * FROM public.users;

のようにしましょう。

PostgreSQLのコマンドラインを抜ける

\q

とする。



データベースを扱う際に使いそうなherokuコマンド、railsコマンド

Rails consoleをherokuで起動
heroku run rails console

・Railsでデータベースを扱う

以下は、ターミナルで「posts」テーブルのマイグレーションファイルを作成するコマンド。

例)ローカル環境で
rails g model Post content:text

上記ではテキスト型の『content』という名前のカラムを作成する準備(マイグレーションファイルの作成)が出来ます。Postという名前のモデルが作られます。
テーブル名は複数形の「posts」になります。

その後
rails db:migrate

コマンドで、マイグレーションファイルの指示どおりにデータベースにテーブルが作られます。
※上記のrails db:migrateコマンドは、マイグレーションファイルを作成したあと
ローカル環境・本番環境の両方で実行する必要があります。

モデル作成・データベース構築でミスった場合

rake db:drop データベースの全削除
rake db:create データベースを作成。

そうしたら
rails destroy model [モデル名]
で、
作ったモデルを一度消去したあと、再作成して

rake db:migarate データベースを構築
で、やり直す事が出来ます。

例えばMemoというモデルを作ろうと思ったら

rails g model Memo title:text 
rake db:create

というふうにします。

string : 文字列
text : 長い文字列
integer : 整数
の3つの型をよく使うと思います。
参考:Rails テーブルのデータ型について

・コンソール上からデータを入れる

rails consoleコマンドでコンソールを起動。
その後、コンソール上で
post = Post.new(contnet: "This is a sample.")
この場合はPostモデルからPostインスタンスが作成されます。
そして
post.save
このコマンドで、Postインスタンスがテーブルに保存されます。

・Railsでデータを扱う

Railsではビューにデータを送るために、コントローラーでは

@posts = Post.all

のようにしてPostモデル(postsテーブル)からデータを取得し、

ビューで
<% @posts.each do |post| %>

<%= post.content %>

<% end %>

のようにして値を取り出していきます。

ボカロ新曲ランキングサイトのソングストーリー(https://www.songstory.me/)に
実装していきます。


・メモなど


【本題】Herokuでデータベースを接続する方法

ここからが本題です。とても重要。

1. まずはデータベース自体はHerokuの管理画面で作成しておきます。
Herokuのadd-onでHeroku Postgresを作成できます。

HerokuのPostgreSQLのホビープランでOK。無料なので1万行の制限があるようです。

2.
ローカル環境でモデルを作成し、ローカル環境でデータベースが動くことを確認。

database.ymlは
production:
url: <%= ENV['DATABASE_URL'] %>

本番環境用のデータベースの設定は上記のようにします。
パスワードもユーザー名も必要ありません。

環境変数が設定されているのでHerokuにログインしてデプロイしている時点でOKという感じです。

ちなみにローカル環境用の設定はdatabase.ymlに
development:
<<: *default
database: アプリ名_development
username: postgres
password: パスワード

のようにします。
PostgreSQLのユーザー名はpostgresで大丈夫なはずです。

※ローカル環境にPostgreSQLをインストールして、パスワードを設定してから行って下さい。

テスト環境のところも同様に記述。
test:
<<: *default
database: アプリ名_test
username: postgres
password: パスワード

ローカル環境でモデルを作って
rake db:migrate
コマンドで動くのを確認します。

3.
いよいよHerokuにデプロイします。
モデルを作ってHerokuへデプロイするのは緊張するものです。
でも大丈夫です。
もし駄目でもデータベースを削除してもう一度やれば良いのです。失うものは何もありません。
僕もかなり緊張しました。でも、やらなければ進みません。やってみましょう。

git push heroku master
でデプロイを行ったら、その後に

heroku rake db:migrate
で、マイグレーションをします。これをしないとデータベースが動かないので注意。

ちなみにこのコマンドは
heroku run rake db:migrate

でも動きました。どちらでも大丈夫っぽいです。

dynoの再起動は必要ありませんでした。

以上でデータベースが使えるようになるはずです。
heroku psql
でデータベースにログインして、データが入っているか等を確認してみましょう。


参考:
「PostgreSQLの基本的なコマンド」
https://qiita.com/H-A-L/items/fe8cb0e0ee0041ff3ceb

「データを取得する(SELECT文)」
https://www.dbonline.jp/postgresql/select/index1.html

[PostgreSQL] よく使うコマンドまとめ
https://dev.classmethod.jp/server-side/db/postgresql-organize-command/

[よく使うHerokuコマンド]
https://qiita.com/yuch_i/items/b9898ce482f30ab7ca87

[Progate(プロゲート)]
https://prog-8.com/