Railsで、rails db:migrateを実行したところ、生成しようとしたテーブルがすでに存在するため、作成できないとのエラーが発生。
この時のエラーの対処法について。
エラー詳細
rails db:migrate
== 20210719082013 CreateClients: migrating ====================================
— create_table(:clients)
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:
PG::DuplicateTable: ERROR: relation “clients” already exists
/rails-vue/db/migrate/20210719082013_create_clients.rb:3:in change' /rails-vue/bin/rails:5:in
‘
/rails-vue/bin/spring:10:in block in <top (required)>' /rails-vue/bin/spring:7:in
tap’
/rails-vue/bin/spring:7:in `’
Caused by:
ActiveRecord::StatementInvalid: PG::DuplicateTable: ERROR: relation “clients” already exists
/rails-vue/db/migrate/20210719082013_create_clients.rb:3:in change' /rails-vue/bin/rails:5:in
‘
/rails-vue/bin/spring:10:in block in <top (required)>' /rails-vue/bin/spring:7:in
tap’
/rails-vue/bin/spring:7:in `’
エラー対処法
DBを一旦削除して、再度生成するとマイグレーションできるようになります。
rails db:drop
rails db:create
rails db:migrate
実例
# rails db:drop
Dropped database 'rails_vue_development'
Dropped database 'rails_vue_test'
# rails db:create
Created database 'rails_vue_development'
Created database 'rails_vue_test'
# rails db:migrate
== 20210719082013 CreateClients: migrating ====================================
-- create_table(:clients)
-> 0.0431s
== 20210719082013 CreateClients: migrated (0.0432s) ===========================
ERROR: database “DB名” is being accessed by other users
rails db:drop
を実行しようとした時に次のようなエラーが発生した場合は、
一度、railsをシャットダウンしてから再起動すれば、rails db:drop
が実行できるようになります。
※docker exec -itなど、間接的に接続しているものも全てシャットダウン(exit)する。
エラー例
rails db:drop
PG::ObjectInUse: ERROR: database “rails_vue_development” is being accessed by other users
DETAIL: There is 1 other session using the database.
Couldn’t drop database ‘rails_vue_development’
rails aborted!
ActiveRecord::StatementInvalid: PG::ObjectInUse: ERROR: database “rails_vue_development” is being accessed by other users
DETAIL: There is 1 other session using the database.
/rails-vue/bin/rails:5:in <top (required)>' /rails-vue/bin/spring:10:in
block in ‘
/rails-vue/bin/spring:7:in tap' /rails-vue/bin/spring:7:in
‘