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/)に
実装していきます。
・メモなど
># DBのマイグレーション
$ heroku run rake db:migrate# dynoの再起動
$ heroku ps:restart—-
Heroku PostgresをRailsアプリで利用する手順 https://t.co/R2pdbdzrOgHerokuのPostgreSQLにログインしてSQLを直接実行する。 https://t.co/lR9bBH8LM4
— りーず Leez(そーめる) (@so_meru) August 23, 2020
【本題】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/