Help us understand the problem. What is going on with this article?

PG::ObjectInUse: ERROR: database "myapp_development" is being accessed by other users

ポートフォリオ作成中

db/seeds.rb
User.create!(name: "テスト 太郎",
             email: "test@example.com",
             password: "foobar",
             password_confirmation: "foobar"
)

99.times do |n|
  name = Faker::Name.name
  email = "test#{n}@example.com"
  password = "foobar"
  User.create!(name: name,
               email: email,
               password: password,
               password_confirmation: password)
end

ページネーションを実装していくため
テスト用アカウントを作成しようとすると、
こんなエラーが出ました。

$ rails db:migrate:reset

を実行すると

PG::ObjectInUse: ERROR:  database "myapp_development" is being accessed by other users
DETAIL:  There is 1 other session using the database.

「myapp_debelopment」データベースは、他のセッションで使われているとのこと。

データベースはこのような構成

config/database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password: password
  pool: 5

development:
  <<: *default
  database: myapp_development

test:
  <<: *default
  database: myapp_test

色々と調べていく中で
下記を参考にして、データベースを一度削除して
作成し直すことにしました。
https://stackoverflow.com/questions/46451472/unable-to-make-rake-dbdrop-work-in-development-with-rails-5-1-4

$ docker exec -it (コンテナ名) /bin/bash

コンテナの中に入ります。

$ rails db:drop
Dropped database 'myapp_development'
Dropped database 'myapp_test'
$ rails db:create
$ rails db:migrate
== 20200704040832 CreateUsers: migrating ======================================
-- create_table(:users)
   -> 0.0426s
== 20200704040832 CreateUsers: migrated (0.0432s) =============================

== 20200704043311 AddIndexToUsersEmail: migrating =============================
-- add_index(:users, :email, {:unique=>true})
   -> 0.0303s
== 20200704043311 AddIndexToUsersEmail: migrated (0.0307s) ====================

== 20200704043511 AddPasswordDigestToUsers: migrating =========================
-- add_column(:users, :password_digest, :string)
   -> 0.0026s
== 20200704043511 AddPasswordDigestToUsers: migrated (0.0031s) ================

== 20200705055948 AddRememberDigestToUsers: migrating =========================
-- add_column(:users, :remember_digest, :string)
   -> 0.0025s
== 20200705055948 AddRememberDigestToUsers: migrated (0.0027s) ================
$ rails db:seed
$ exit

これで、無事動きました!

おそらく、
最初にデータベースを作成した際に
コンテナに入って作成するのではなく、
ローカル環境から下記コマンドで実行したから?
作成したユーザーが異なってしまったのではないかと。。

$ docekr-compose run web rails db:create

追記 (2020/7/20)

上記で書いたのは都度、データベースを削除する方法でしたが
下記方法でも行えることがわかりました。

$ docker container ls

動作しているコンテナを確認

3c9b72845b89   postgres  "docker-entrypoint.s…" 8 days ago   Up 6 days   5432/tcp    

コンテナのIDを指定して、コンテナを停止させる。

$ docker container stop 3c9b72845b89

あとは、本来やりたかった内容を実行するだけ

$ rails db:migrate:reset

== 20200704040832 CreateUsers: migrating ======================================
-- create_table(:users)
   -> 0.0426s
== 20200704040832 CreateUsers: migrated (0.0432s) =============================

== 20200704043311 AddIndexToUsersEmail: migrating =============================
-- add_index(:users, :email, {:unique=>true})
   -> 0.0303s
== 20200704043311 AddIndexToUsersEmail: migrated (0.0307s) ====================

== 20200704043511 AddPasswordDigestToUsers: migrating =========================
-- add_column(:users, :password_digest, :string)
   -> 0.0026s
== 20200704043511 AddPasswordDigestToUsers: migrated (0.0031s) ================

== 20200705055948 AddRememberDigestToUsers: migrating =========================
-- add_column(:users, :remember_digest, :string)
   -> 0.0025s
== 20200705055948 AddRememberDigestToUsers: migrated (0.0027s) ================
$ rails db:seed

そして、停止させていたコンテナを動かす。

$ docker container start 3c9b72845b89

これで大丈夫です!

shingokubota
Twitter:@shingo_momiage
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away