rails db:resetでエラーが出たお話

#はじめに
Railsアプリを作成している中で、`rails db:reset`をしたところエラーが発生しました。
結論を先に述べてしまうと、PostgreSQLを再起動すれば正常に作動したというあっさりとしたお話ですが、エラー内容やPostgreSQLのコマンドのメモもかねて事態をまとめたいと思います。

#環境
```
ruby   : 2.5.1
rails  : 5.2.2
psql (PostgreSQL) 11.1
```

#エラー内容
rails serverは閉じた状態で`rails db:reset`をしたところ以下のエラーが出ました。

```
$ rails db:reset
PG::ObjectInUse: ERROR:  database "〇〇_development" is being accessed by other users
DETAIL:  There is 1 other session using the database.
: DROP DATABASE IF EXISTS "〇〇_development"
Couldn't drop database '〇〇_development'
rails aborted!
ActiveRecord::StatementInvalid: PG::ObjectInUse: ERROR:  database "〇〇_development" is being accessed by other users

DETAIL:  There is 1 other session using the database.
: DROP DATABASE IF EXISTS "〇〇_development"
/Users/ユーザー名/practice/〇〇/bin/rails:nine:in `<top (required)>'
/Users/ユーザー名/practice/〇〇/bin/spring:15:in `<top (required)>'
bin/rails:three:in `load'
bin/rails:3:in `<main>'

Caused by:
PG::ObjectInUse: ERROR:  database "〇〇_development" is being accessed by other users
DETAIL:  There is 1 other session using the database.
/Users/ユーザー名/practice/〇〇/bin/rails:nine:in `<top (required)>'
/Users/ユーザー名/practice/〇〇/bin/spring:15:in `<top (required)>'
bin/rails:three:in `load'
bin/rails:3:in `<main>'
Tasks: TOP => db:drop:_unsafe
(See full trace by running task with --trace)
```

#解決に向けて
エラーの原因は上述の通り、
・ database "〇〇_development" is being accessed by other users
・ There is 1 other session using the database
です。
アプリで作成したuserデータは以下の通りで、id=1に関してはdestroyしていました。

```
[1] pry(main)> User.all
  User Load (0.9ms)  SELECT "users".* FROM "users"
=> [#<User id: 2, email: "〇〇@gmail.com", created_at: "2019-02-19 09:27:13", updated_at: "2019-02-19 09:27:13", name: "〇〇", profile_photo: nil>]
```
冒頭で述べた通り、rails serverは閉じており、当然他のユーザーがアクセスしていることもありません。
そこでデータベースに接続中のセッションの有無を確認することにしました。

###PostgreSQLをイジる
主に[[PostgreSQL] 接続中のセッションを切断する](https://qiita.com/iewori/items/0461f2c0e9e8ce0fd1ee)と、サイトにもリンクが貼られている[表 27-2. pg_stat_activityビュー](https://www.postgresql.jp/document/9.2/html/monitoring-stats.html#PG-STAT-ACTIVITY-VIEW)を参考にしました。

```
$ psql postgres
postgres=# select pid, datname, client_addr from pg_stat_activity where datname = '{〇〇_development}';
 pid | datname | client_addr 
-----+---------+-------------
(0 rows)
```
アクセスがあると言われたデータベースに接続しているセッションは見つかりませんでした。

#結論
よく分からなかったのでとりあえずPostgreSQLを再起動させたら`rails db:reset`は正常に実行されました。

*追記
アクセスが１つあった原因はSQLクライアントのTeamSQLを接続していたからだと思われます。。。

##備考
アクティブなセッションの有無を確認する際、selectやwhereを使って検索条件を絞ってりましたが、PostgreSQLの再起動前後で一切条件を絞らずに確認したところ、以下のように違いが出ました。
ただ単純にPostgreSQLが正常に動作してなかったのかなんなのか。。。データベースに関する理解がまだ不十分であるため時間をとって勉強したいと思います。

```
再起動前
postgres=# select * from pg_stat_activity;
 datid |       datname        |  pid  | usesysid |    usename     |    application_name    | client_addr | client_hostname | client_port |         backend_start         |          xact_start           |          query_start          |         state_change          | wait_event_type |     wait_event      | state  | backend_xid | backend_xmin |       query       |         backend_type         
-------+----------------------+-------+----------+----------------+------------------------+-------------+-----------------+-------------+-------------------------------+-------------------------------+-------------------------------+-------------------------------+-----------------+---------------------+--------+-------------+--------------+-------------------+------------------------------
       |                      | 62989 |          |                |                        |             |                 |             | 2019-02-13 16:13:43.580955+09 |                               |                               |                               | Activity        | AutoVacuumMain      |        |             |              |                   | autovacuum launcher

```
```
再起動後
postgres=# select * from pg_stat_activity;
 datid | datname  |  pid  | usesysid |    usename     | application_name | client_addr | client_hostname | client_port |         backend_start         |          xact_start           |          query_start          |         state_change         | wait_event_type |     wait_event      | state  | backend_xid | backend_xmin |              query                                                         |                                                           
                                                              backend_type         
-------+----------+-------+----------+----------------+------------------+-------------+-----------------+-------------+-------------------------------+-------------------------------+-------------------------------+------------------------------+-----------------+---------------------+--------+-------------+--------------+---------------------------------+------------------------------
       |          | 78885 |          |                |                  |             |                 |             | 2019-02-19 20:15:26.533763+09 |                               |                               |                              | Activity        | AutoVacuumMain      |        |             |              |                                 | autovacuum launcher
       |          | 78887 |       10 | 〇〇            |                  |             |                 |             | 2019-02-19 20:15:26.534469+09 |                               |                               |                              | Activity        | LogicalLauncherMain |        |             |              |                                 | logical replication launcher
 13364 | postgres | 79041 |       10 | 〇〇            | psql             |             |                 |          -1 | 2019-02-19 20:27:34.681684+09 | 2019-02-19 22:51:59.447419+09 | 2019-02-19 22:51:59.447419+09 | 2019-02-19 22:51:59.44742+09 |                 |                     | active |             |          601 | select * from pg_stat_activity; | client backend
       |          | 78883 |          |                |                  |             |                 |             | 2019-02-19 20:15:26.533005+09 |                               |                               |                              | Activity        | BgWriterHibernate   |        |             |              |                                 | background writer
       |          | 78882 |          |                |                  |             |                 |             | 2019-02-19 20:15:26.53262+09  |                               |                               |                              | Activity        | CheckpointerMain    |        |             |              |                                 | checkpointer
       |          | 78884 |          |                |                  |             |                 |             | 2019-02-19 20:15:26.533406+09 |                               |                               |                              | Activity        | WalWriterMain       |        |             |              |                                 | walwriter
(6 rows)

```

#参考にしたサイト
・[PostgreSQL DROP DATABASE](http://www.postgresqltutorial.com/postgresql-drop-database/)
・[PostgreSQL - DBに接続しているセッションの確認](https://blog.y-yuki.net/entry/2017/03/30/000000)
・[PostgreSQLのデータベースにアクセスしているセッションを切断する](http://nestblog.blog.fc2.com/blog-entry-86.html)