Закройте существующее Postgres соединение с помощью psycopg2 - PullRequest
0 голосов
/ 14 января 2020

Я играл с Postgresql и psycopg2. Я думаю, что я начал много подключений, используя терминал, но никогда не закрывал его. Используя pyscopg2, я понял, как установить соединение и закрыть его. Теперь я пытался получить существующее соединение (которое я запустил с помощью терминала ранее), используя pyscopg2, но, похоже, проблема с номером порта.

Когда я запускаю 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     
-------+----------------+-------+----------+----------------+------------------+-------------+-----------------+-------------+-------------------------------+-------------------------------+-------------------------------+-------------------------------+-----------------+---------------------+---------------------+-------------+--------------+----------------------------------------------------------------+---------------------
       |                | 75600 |          |                |                  |             |                 |             | 2020-01-13 15:28:42.66597+01  |                               |                               |                               | Activity        | AutoVacuumMain      |                     |             |              |                                                                | autovacuum launcher
       |                | 75602 |       10 | siddhanttandon |                  |             |                 |             | 2020-01-13 15:28:42.666037+01 |                               |                               |                               | Activity        | LogicalLauncherMain |                     |             |              |                                                                | background worker
 16385 | siddhanttandon | 77470 |       10 | siddhanttandon | agens            |             |                 |          -1 | 2020-01-13 16:04:04.907286+01 |                               |                               | 2020-01-13 16:04:04.910102+01 | Client          | ClientRead          | idle                |             |              |                                                                | client backend
 16385 | siddhanttandon | 77115 |       10 | siddhanttandon |                  | 127.0.0.1   |                 |       54156 | 2020-01-13 15:45:08.361864+01 | 2020-01-13 15:45:08.365267+01 | 2020-01-13 15:45:08.366289+01 | 2020-01-13 15:45:08.369882+01 | Client          | ClientRead          | idle in transaction |             |              | MATCH (a)-[r]->(b) RETURN id(a) AS startNode, id(b) AS endNode | client backend
 16385 | siddhanttandon | 82701 |       10 | siddhanttandon | agens            |             |                 |          -1 | 2020-01-14 12:08:16.601504+01 | 2020-01-14 13:16:55.356656+01 | 2020-01-14 13:16:55.356656+01 | 2020-01-14 13:16:55.35666+01  |                 |                     | active              |             |          565 | SELECT * FROM pg_stat_activity ;                               | client backend
       |                | 75598 |          |                |                  |             |                 |             | 2020-01-13 15:28:42.662682+01 |                               |                               |                               | Activity        | BgWriterHibernate   |                     |             |              |                                                                | background writer
       |                | 75597 |          |                |                  |             |                 |             | 2020-01-13 15:28:42.662907+01 |                               |                               |                               | Activity        | CheckpointerMain    |                     |             |              |                                                                | checkpointer
       |                | 75599 |          |                |                  |             |                 |             | 2020-01-13 15:28:42.6631+01   |                               |                               |                               | Activity        | WalWriterMain       |                     |             |              |                                                                | walwriter 

Соединение на 127.0.0.1, на порту 54156 - это то, что я хочу закрыть. Поэтому я подумал, что смогу получить это существующее соединение в psycopg2, используя следующие строки:

import psycopg2.pool
dbpool = psycopg2.pool.ThreadedConnectionPool(minconn=5,maxconn=25,host='127.0.0.1',
                                          port='54156',
                                          dbname='test_db',
                                          user='siddhanttandon'
                                          )
dbpool.closeall()

Но это дает мне ошибку:

could not connect to server: Connection refused
    Is the server running on host "localhost" (::1) and accepting
    TCP/IP connections on port 54156?
could not connect to server: Connection refused
    Is the server running on host "localhost" (127.0.0.1) and accepting
    TCP/IP connections on port 54156?

Возможно, соединение не активно этот IP и номер порта, поэтому я сделал netstat | grep postgres, чтобы подтвердить, что соединения все еще активны, и вот результаты:

MBP-di-Siddhant:agensgraph siddhanttandon$ netstat | grep postgres
tcp4       0      0  localhost.postgresql   localhost.54156        ESTABLISHED
tcp4       0      0  localhost.54156        localhost.postgresql   ESTABLISHED

В идеале я хотел бы контролировать настройку соединения с существующими БД и закрытие соединений с использованием python вместо использования интерфейса командной строки.

Буду очень признателен, если кто-нибудь скажет мне, как я могу запустить / закрыть эти соединения, используя psycopg2?

1 Ответ

0 голосов
/ 14 января 2020

Вы не можете просто использовать номер порта клиента, чтобы каким-то образом захватить и захватить соединение.

Если вы хотите принудительно закрыть соединение, вы используете pid. Из командной строки linux: kill 77115 или из командной строки SQL (или из psycopg2 через другое соединение): select pg_terminate_backend(77115).

...