sqlite3 DB(on Mac) と postgresql DB(on Heroku) を同期する
私の場合 Rails の開発環境とステージング環境をそれぞれ以下のように構築しています。開発に伴う動作確認や実際の英単語の入力は開発環境(Mac mini)で行うことがほとんどなので、自然と両環境での DB に差分が発生します。
環境 | ホスト | DB |
---|---|---|
開発環境 | Mac mini | sqlite3 |
ステージング環境 | Heroku | postgresql |
ここではデータベースツールキットの sequel とカスタム rake タスクを使用して両環境の DB を同期する方法を紹介します。同様の環境で開発している方の参考になれば幸いです。
実装内容
rails コマンド(rake タスク) に独自のネームスペースとして custom を用意し、その配下に db:sync タスクを定義します。タスク自体は heroku コマンドと sequel を組み合わせた単純なものです。
$ bundle exec rails -T | grep custom rails custom:db:sync # Synchronize db between development and staging
lib/tasks/custom.rake
namespace :custom do namespace :db do desc "Synchronize db between development and staging" task :sync do app = `heroku apps | sed '/^$/d' | tail -1`.chomp postgresql_credentials_url = `heroku pg:credentials:url | tail -1` sh "heroku pg:reset -a #{app} --confirm #{app}" sh "bundle exec sequel -C sqlite://db/development.sqlite3 #{postgresql_credentials_url}" sh "heroku run rake db:migrate" end end end
Gemfile
group :development do (... snip ...) # Use the database toolkit for ruby [https://github.com/jeremyevans/sequel] gem "sequel" (... snip ...) end group :staging do # See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem gem "pg", platforms: %i[ mri mingw x64_mingw ] end
カスタム rake タスクから heroku コマンドと sequel を呼び出した様子
LiteFS
SQLite 推しなので LiteFS の今後に注目しています (^_^)