はじめに
なんかサービス作るときに、DBどうする問題があると思います
クラウドのDBはなかなかお高くて、低コストで運用したいなと思ったときに困ったので調べてました
結果、Supabaseがよさそうだったので使ってみます
単純にDBだけならPlanetScaleのほうが無料枠が充実していてよいかと思ったけど、ユーザ認証など今後も見据えてSupabaseをチョイスしました
今回は、RailsからSupabaseのPostgreSQLに接続してみます
環境
Rails v7.0.4
Supabase Postgres
Supabase Sing up
GitHubのアカウントがある人はGitHub認証すればOKです
Supabase Create Project
Projectを作成します
Project名はお好きな名前を入力
DBのパスワードは、Generate a password
リンクをクリックしたら作ってくれます
パスワード忘れちゃっても、あとでリセットできるので大丈夫です
リージョンはOriginがどこにあるかで決めるといいかもです
今回のRailsアプリは東京リージョンにデプロイするので、同じ東京リージョンに作成します
Create new project
をポッチとすれば作成できます
PostgreSQLのバージョン
Supabase PostgreSQLのバージョンがきになったので調べてみます
サイドバーのSQL Editor
をクリックします
SQLを入力して、Run
ボタンをクリックしたらバージョンが表示されるはず
select version();
PostgreSQLのバージョンはv14.1みたですね
PostgreSQLの設定
Railsで必要になるのは、Host
、Database name
, User
, Password
(さっき設定したやつ)
あと、SSL接続したいので証明書をダウンロードしておきましょう
以上でSupabase
の設定はおしまいです
Rails setup
Railsアプリを作成します
gem install rails
rails new -d postgresql examples-supabase
config/database.ymlを修正
今回はお試しなので、developmentを修正してます
通常、developmentはローカルDBを使えばよいかと思いますー
先程、ダウンロードした証明書をexamples-supabase
ディレクトリにコピーします
証明書をコミットしないようにgitignoreに追加しときましょう
default: &default
adapter: postgresql
encoding: unicode
# For details on connection pooling, see Rails configuration guide
# https://guides.rubyonrails.org/configuring.html#database-pooling
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
development:
<<: *default
host: <%= ENV["APP_DATABASE_HOST"] %>
database: postgres
username: postgres
password: <%= ENV["APP_DATABASE_PASSWORD"] %>
sslmode: verify-full
sslrootcert: prod-ca-2021.crt
Rails Running
scaffoldして、実際に動作するか確認してみましょう
databaseはすでにあるので、migrateだけでOKです
$ rails g scaffold posts title:string
invoke active_record
create db/migrate/20221126125618_create_posts.rb
create app/models/post.rb
invoke test_unit
create test/models/post_test.rb
create test/fixtures/posts.yml
invoke resource_route
route resources :posts
invoke scaffold_controller
create app/controllers/posts_controller.rb
invoke erb
create app/views/posts
create app/views/posts/index.html.erb
create app/views/posts/edit.html.erb
create app/views/posts/show.html.erb
create app/views/posts/new.html.erb
create app/views/posts/_form.html.erb
create app/views/posts/_post.html.erb
invoke resource_route
invoke test_unit
create test/controllers/posts_controller_test.rb
create test/system/posts_test.rb
invoke helper
create app/helpers/posts_helper.rb
invoke test_unit
invoke jbuilder
create app/views/posts/index.json.jbuilder
create app/views/posts/show.json.jbuilder
create app/views/posts/_post.json.jbuilder
$ bin/rails db:migrate
== 20221126125618 CreatePosts: migrating ======================================
-- create_table(:posts)
-> 0.1090s
== 20221126125618 CreatePosts: migrated (0.1091s) =============================
できたっぽいですねー
Railsを起動して、実際にデータ登録してみましょう
bin/rails s
http://localhost:3000/posts/
へアクセスします
登録できました
Supabaseでも確認してみましょう
ちゃんと登録できてますねー
まとめ
Good
RailsでもSupabaseのPostgreSQLをかんたんに使うことができました
Supabaseのセットアップもちょーかんたん
Not Good
Supabaseのレスポンスが若干もたつくときがあるのでちょっと気になりました
といっても100msくらいで、自分のネット環境が微妙なのかもしれません
最後に
導入自体はすごく簡単で、移行もすんなりいくんじゃないかなと思います
ただプロダクトで、無料枠内での利用は厳しそうですね。。。
僕はProで運用してみようと思います
Supabaseの他の機能、認証やroleなんかも使っていきたいと思いますー
ではまたー