13
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

RailsでSupabaseのPostgreSQLを使ってみる

Posted at

はじめに

なんかサービス作るときに、DBどうする問題があると思います
クラウドのDBはなかなかお高くて、低コストで運用したいなと思ったときに困ったので調べてました
結果、Supabaseがよさそうだったので使ってみます

単純にDBだけならPlanetScaleのほうが無料枠が充実していてよいかと思ったけど、ユーザ認証など今後も見据えてSupabaseをチョイスしました

今回は、RailsからSupabaseのPostgreSQLに接続してみます :smile:

環境

Rails v7.0.4
Supabase Postgres

Supabase Sing up

GitHubのアカウントがある人はGitHub認証すればOKです

Supabase Create Project

Projectを作成します

Project名はお好きな名前を入力
DBのパスワードは、Generate a passwordリンクをクリックしたら作ってくれます
パスワード忘れちゃっても、あとでリセットできるので大丈夫です :smile:

リージョンはOriginがどこにあるかで決めるといいかもです
今回のRailsアプリは東京リージョンにデプロイするので、同じ東京リージョンに作成します

Create new projectをポッチとすれば作成できます :thumbsup:

Supabase.png

PostgreSQLのバージョン

Supabase PostgreSQLのバージョンがきになったので調べてみます

examples-supabase___Supabase.png

サイドバーのSQL Editorをクリックします

SQL___Supabase.png

SQLを入力して、Runボタンをクリックしたらバージョンが表示されるはず

select version();

PostgreSQLのバージョンはv14.1みたですね

SQL___Supabase.png

PostgreSQLの設定

Railsで必要になるのは、HostDatabase name, User, Password (さっき設定したやつ)
あと、SSL接続したいので証明書をダウンロードしておきましょう

Database___Supabase.png

以上でSupabaseの設定はおしまいです

Rails setup

Railsアプリを作成します

gem install rails
rails new -d postgresql examples-supabase

config/database.ymlを修正

:warning: 今回はお試しなので、developmentを修正してます :warning:
通常、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/へアクセスします

登録できました

App.png

Supabaseでも確認してみましょう

ちゃんと登録できてますねー :tada:

examples-supabase___Supabase.png

まとめ

Good

RailsでもSupabaseのPostgreSQLをかんたんに使うことができました
Supabaseのセットアップもちょーかんたん

Not Good

Supabaseのレスポンスが若干もたつくときがあるのでちょっと気になりました :thinking:
といっても100msくらいで、自分のネット環境が微妙なのかもしれません

最後に

導入自体はすごく簡単で、移行もすんなりいくんじゃないかなと思います
ただプロダクトで、無料枠内での利用は厳しそうですね。。。 :frowning2:
僕はProで運用してみようと思います

Supabaseの他の機能、認証やroleなんかも使っていきたいと思いますー
ではまたー

13
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?