Heroku 複数のアプリ間でHerokuPostgresデータベースを共有する
やったこと
Herokuの同一アカウント上で運営している2つのアプリ間でデータベースを共有した。
前提
- origin_appとnew_appを運営
- アプリフレームワークはSinatra
- ORMフレームワークはActive Record
- origin_appで既にHeroku Postgresを使用
- new_appからorigin_appのデータベースを利用する
環境変数の取得
Heroku Postgresの共有に関する解説ページはこちら。
Heroku Dev Center
Heroku Postgres
Sharing Heroku Postgres between applications
https://devcenter.heroku.com/articles/heroku-postgresql#sharing-heroku-postgres-between-applications
Herokuにログイン後、次のコマンドを入力する。
$ heroku addons:attach origin_app::DATABASE --app new_app
これで環境変数が割り当てられる。
Attaching postgresql-infinite-***** to new_app... done
Setting HEROKU_POSTGRESQL_[Color] config vars and restarting new_app... done, v***
[Color]には各々色名が入る。
Herokuアプリで接続する
割り当てられた環境変数をつかってコードを書く。
- 割り当てられた色名を例としてBRONZEとする
- origin_appにはusersテーブルがある
- usersのカラム
- id (int)
- name (varchar)
new_app/main.rb
require 'sinatra' require 'active_record' class User < ActiveRecord::Base establish_connection(ENV['HEROKU_POSTGRESQL_BRONZE_URL']) end get '/' do # usersテーブルの全てのレコードを取得する user = User.new @users = user.all erb :index end
new_app/views/index.erb
<html> <body> <ul> <% @users.each do |user| %> <li><%= "#{user[:id]} #{user[:name]}" %></li> <% end %> </ul> </body> </html>
今回の環境
Ruby 2.7.1p83
Sinatra 2.0.8
Active Record 6.0.3
pg 1.2.3