Czasami podczas rozwoju może wystąpić błąd PG::ObjectInUse: ERROR.
Na przykład:
rake db:drop;
Pokaże nam następujący błąd:
PG::ObjectInUse: ERROR: database "myproject_development" is being accessed by other users
DETAIL: There is 1 other session using the database
Couldn't drop database 'myproject_development'
rake aborted!
ActiveRecord::StatementInvalid: PG::ObjectInUse: ERROR: database "myproject_development" is being accessed by other users
DETAIL: There is 1 other session using the database.
Caused by:PG::ObjectInUse: ERROR: database "myproject_development" is being accessed by other users
DETAIL: There is 1 other session using the database.
Tasks: TOP => db:drop:_unsafe
(See full trace by running task with --trace)
Tu wszystko jest dość proste. Komunikat jest bardzo informacyjny i dosłownie mówi -
database "myproject_development" is being accessed by other users. To znaczy, że obecnie nie możemy usunąć bazy danych, ponieważ ma aktywne połączenie. Lokalne zazwyczaj to albo uruchomiony serwer rails i/lub rails c (konsola). Musimy je zamknąć, aby proces odłączył się od bazy danych. Po tym ponownie uruchamiamy rake db:drop; i wszystko powinno działać.
Czasami może się zdarzyć, że lokalnie wydaje się, że nie ma otwartych procesów / połączeń w terminalu, ale nadal mamy błąd "database is being accessed by other users". Zazwyczaj oznacza to, że gdzieś mamy proces, który nadal pracuje z bazą danych. Czasami może to być proces w tle / demon. Ale aby znaleźć i zabić ten proces - potrzebujemy więcej kontekstu. Można przeskanować porty i procesy i zabić te, które używają bazy. Ale o tym prawdopodobnie napiszę w innej notatce.