Techioz Blog

「rails db:system:change –to=postgresql」の後に「rails server」、「rails db:merge」が動作を停止する

概要

再現する手順:

「rails サーバー」を実行しようとすると、ターミナル出力は正常に見えますが、Microsoft Edge ブラウザ経由で接続しようとすると、無限にロードされるだけです。 「rails server」はステップ6の前で動作します。

「rails db:merge」を実行すると、エラーが発生せずに無限実行のままになります。以下のトレースを参照してください。

Render.com にデプロイすると機能します。

これがプロジェクト全体です。何が起こっているか理解したら非公開にします: https://github.com/Ferdodonna/sample_app

ステップ 6 の前の Gemfile、ステップ 6 の後、gem “sqlite3”、“1.4.2” は gem “pg”、“1.4.2” になります。

source "https://rubygems.org"
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
ruby "3.1.2"

gem "rails", "7.0.4"

gem "sassc-rails", "2.1.2"

gem "sprockets-rails", "3.4.2"

gem "importmap-rails", "1.1.0"

gem "turbo-rails", "1.1.1"

gem "stimulus-rails", "1.0.4"

gem "jbuilder", "2.11.5"

gem "puma", "5.6.4"

gem "bootsnap", "1.12.0", require: false

group :development, :test do
  gem "sqlite3", "1.4.2"
  gem "debug", "1.5.0", platforms: %i[ mri mingw x64_mingw ]
end

group :development do
  gem "web-console", "4.2.0"
end

group :test do
  gem "capybara", "3.37.1"
  gem "selenium-webdriver", "4.2.0"
  gem "webdrivers", "5.0.0"
  gem "rails-controller-testing", "1.0.5"
  gem "minitest", "5.15.0"
  gem "minitest-reporters", "1.5.0"
  gem "guard", "2.18.0"
  gem "guard-minitest", "2.4.6"
end

group :production do
  gem "pg", "1.3.5"
end
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem.
# Uncomment the following line if you're running Rails
# on a native Windows system:
gem "tzinfo-data" #, platforms: [:mingw, :mswin, :x64_mingw, :jruby]

ステップ6後の「railsサーバー」のターミナル出力

=> Booting Puma
=> Rails 7.0.4 application starting in development
=> Run `bin/rails server --help` for more startup options
*** SIGUSR2 not implemented, signal based restart unavailable!
*** SIGUSR1 not implemented, signal based restart unavailable!
*** SIGHUP not implemented, signal based logs reopening unavailable!
Puma starting in single mode...
* Puma version: 5.6.4 (ruby 3.1.2-p20) ("Birdie's Version")
*  Min threads: 5
*  Max threads: 5
*  Environment: development
*          PID: 10656
* Listening on http://[::1]:3000
* Listening on http://127.0.0.1:3000
Use Ctrl-C to stop

ステップ 6 後の「rails db:merge –trace」のターミナル出力

>rails db:migrate --trace
** Invoke db:migrate (first_time)
** Invoke db:load_config (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute db:load_config
** Execute db:migrate

ステップ 6 の後に「rails db:merge –trace」を中止するためのターミナル出力

...
** Execute db:migrate
rails aborted!
Interrupt:
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/pg-1.3.5-x64-mingw-ucrt/lib/pg/connection.rb:627:in `wait_writable'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/pg-1.3.5-x64-mingw-ucrt/lib/pg/connection.rb:627:in `async_connect_or_reset'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/pg-1.3.5-x64-mingw-ucrt/lib/pg/connection.rb:707:in `new'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/pg-1.3.5-x64-mingw-ucrt/lib/pg.rb:69:in `connect'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/activerecord-7.0.4/lib/active_record/connection_adapters/postgresql_adapter.rb:78:in `new_client'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/activerecord-7.0.4/lib/active_record/connection_adapters/postgresql_adapter.rb:37:in `postgresql_connection'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/activerecord-7.0.4/lib/active_record/connection_adapters/abstract/connection_pool.rb:656:in `public_send'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/activerecord-7.0.4/lib/active_record/connection_adapters/abstract/connection_pool.rb:656:in `new_connection'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/activerecord-7.0.4/lib/active_record/connection_adapters/abstract/connection_pool.rb:700:in `checkout_new_connection'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/activerecord-7.0.4/lib/active_record/connection_adapters/abstract/connection_pool.rb:679:in `try_to_checkout_new_connection'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/activerecord-7.0.4/lib/active_record/connection_adapters/abstract/connection_pool.rb:640:in `acquire_connection'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/activerecord-7.0.4/lib/active_record/connection_adapters/abstract/connection_pool.rb:341:in `checkout'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/activerecord-7.0.4/lib/active_record/connection_adapters/abstract/connection_pool.rb:181:in `connection'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/activerecord-7.0.4/lib/active_record/connection_adapters/abstract/connection_handler.rb:211:in `retrieve_connection'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/activerecord-7.0.4/lib/active_record/connection_handling.rb:313:in `retrieve_connection'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/activerecord-7.0.4/lib/active_record/connection_handling.rb:280:in `connection'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/activerecord-7.0.4/lib/active_record/tasks/database_tasks.rb:262:in `migrate'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/activerecord-7.0.4/lib/active_record/railties/databases.rake:92:in `block (2 levels) in <main>'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/rake-13.1.0/lib/rake/task.rb:281:in `block in execute'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/rake-13.1.0/lib/rake/task.rb:281:in `each'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/rake-13.1.0/lib/rake/task.rb:281:in `execute'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/rake-13.1.0/lib/rake/task.rb:219:in `block in invoke_with_call_chain'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/rake-13.1.0/lib/rake/task.rb:199:in `synchronize'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/rake-13.1.0/lib/rake/task.rb:199:in `invoke_with_call_chain'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/rake-13.1.0/lib/rake/task.rb:188:in `invoke'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/rake-13.1.0/lib/rake/application.rb:182:in `invoke_task'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/rake-13.1.0/lib/rake/application.rb:138:in `block (2 levels) in top_level'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/rake-13.1.0/lib/rake/application.rb:138:in `each'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/rake-13.1.0/lib/rake/application.rb:138:in `block in top_level'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/rake-13.1.0/lib/rake/application.rb:147:in `run_with_threads'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/rake-13.1.0/lib/rake/application.rb:132:in `top_level'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/railties-7.0.4/lib/rails/commands/rake/rake_command.rb:24:in `block (2 levels) in perform'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/rake-13.1.0/lib/rake/application.rb:208:in `standard_exception_handling'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/railties-7.0.4/lib/rails/commands/rake/rake_command.rb:24:in `block in perform'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/rake-13.1.0/lib/rake/rake_module.rb:59:in `with_application'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/railties-7.0.4/lib/rails/commands/rake/rake_command.rb:18:in `perform'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/railties-7.0.4/lib/rails/command.rb:51:in `invoke'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/railties-7.0.4/lib/rails/commands.rb:18:in `<main>'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/bootsnap-1.12.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/bootsnap-1.12.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
bin/rails:4:in `<main>'
Tasks: TOP => db:migrate
Terminate batch job (Y/N)? y

アプリケーションにローカルで接続することを期待して Rails サーバーを実行してみました。

アプリケーションにローカルで接続することを期待して Rails サーバーを実行してみました。

存在せず、「railsサーバー」がエミュレートしないpostgresqlデータベースに接続しようとしていると思います。しかし、私はRubyだけでなくRubyOnRailsも初めてなので、よくわかりません。それを回避する方法はありますか?

解決策

Github の config/database.yml を見てみましょう。そこには次のものがあります:

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
  database: sample_app_development

これは基本的にローカルホスト上の存在しないサーバーに接続しようとします。したがって、これを次のように変更する必要があります

development:
  adapter: sqlite3
  database: db/development.sqlite3
  pool: 5
  timeout: 5000

さらに、Gemfile 内のバージョン文字列を変更することもできます。

 gem sqlite3, '~> 1.6'           #, "1.4.2" --> https://rubygems.org/gems/sqlite3/
 gem pg , '~> 1.5'               #, "1.3.5" --> https://rubygems.org/gems/pg/

どちらの宝石も過去にいくつかのアップデートを受けているためです。