RailsでSupabaseのPostgreSQLを使ってみる

# はじめに

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

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

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

https://supabase.com/

https://planetscale.com/

# 環境
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6470/fe655e39-d9f4-aec8-6255-ba779db5948c.png)

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

![examples-supabase___Supabase.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6470/2d10da5e-4a7f-932c-fc58-e8976d853901.png)

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

![SQL___Supabase.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6470/562613d4-f3b5-a210-a81a-aa1eea2843e5.png)

SQLを入力して、`Run`ボタンをクリックしたらバージョンが表示されるはず
```
select version();
```
PostgreSQLのバージョンはv14.1みたですね

![SQL___Supabase.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6470/9fdd1dbc-24ef-2646-1207-b317e289eddb.png)

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

![Database___Supabase.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6470/b9a37282-6114-e9c5-7638-f325dbb59120.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6470/9c6207af-e7a4-7c08-6d79-0ad9c8098901.png)

## Supabaseでも確認してみましょう
ちゃんと登録できてますねー :tada: 

![examples-supabase___Supabase.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6470/bca3b3a0-e8f0-881c-3500-f2e9890940aa.png)

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

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

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

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