Techioz Blog

ローカルのロールバックデータベースがサーバーRails 7のpostgresを更新しない

概要

サーバー上で Rails 7 を実行していますが、新しいテーブルを追加すると移行され、サーバー データベースで確認できます。しかし、開発環境でロールバックして変更を加えてから移行すると、サーバーのデータベースが更新されませんでした。

データベース.yml

# SQLite. Versions 3.8.0 and up are supported.
#   gem install sqlite3
#
#   Ensure the SQLite 3 gem is defined in your Gemfile
#   gem "sqlite3"
#
default: &default
  adapter: sqlite3
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000

development:
  <<: *default
  database: db/development.sqlite3

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: db/test.sqlite3

production:
  <<: *default
  database: db/production.sqlite3

デプロイ/production.rb :

server 'ip_here', user: 'user_here', roles: %w{app db web}

私も試してみました:

cap production deploy:migrate

しかしうまくいきませんでした。また、新しく更新された移行ファイルがサーバーに存在するかどうかを調べたところ、存在します。

解決策

あなたは移行がどのようにデプロイされるかを誤解しています。

一言で言えば、私のアドバイスは次のとおりです。

この質問の対象となっている特定の移行ファイル (古いバージョンと新しいバージョン) を共有していませんが、たとえば次のようなものを使用するとよいでしょう。

change_column
rename_column
rename_index
rename_table

または、2 つのステップで変更を行うこともできます。列の削除 … 列の追加

実稼働システムは、ロールバックしてから再移行する必要があることをなぜ認識しなかったのでしょうか?

各移行ファイルには特定のバージョン番号が付いています。 20240502100000。実稼働環境にデプロイして移行した後、実稼働データベースにはこの移行が「適用済み」として保存されます。

ファイルを編集して再デプロイしたとき、実稼働システムの観点からは、この移行はすでに適用されています。ファイルが編集されたことは認識されず、ロールバックして再度移行するための明示的なコマンドを実行することもありませんでした。

このため、通常は新しい移行ファイルを作成することが最善の方法となります。