Bekkazy
@Bekkazy

Надо ли закрывать соединение psycopg2 когда программа заканчивается кодом Process finished with exit code -1?

Я новичок в Python и тут в голове возник вопрос "А надо ли закрывать соединение, когда сам останавливаю программу в Pycharm?" (Программа работает в бесконечном цикле и останавливать приходится вручную). Потому что сейчас очень много тестирую, и не получится ли так, что будут висеть большое количество не закрытых соединений в БД?
  • Вопрос задан
  • 519 просмотров
Решения вопроса 1
deepblack
@deepblack Куратор тега Python
Используйте менеджер контекста:

from contextlib import closing
with closing(psycopg2.connect(...)) as conn:
    with conn.cursor() as cursor:
        cursor.execute('SELECT * FROM users LIMIT 5')
        for row in cursor:
            print(row)


UPD:

Могу порекомендовать ознакомиться с этим

Пример использования (выдернул из проекта)
from psycopg2.pool import ThreadedConnectionPool
from psycopg2.extras import RealDictCursor
from contextlib import contextmanager
from urllib.parse import urlparse

DATABASE_URL = 'postgresql://postgres:postgres@localhost/postgres'
url = urlparse(DATABASE_URL)

pool = ThreadedConnectionPool(1, 50,
                              database=url.path[1:],
                              user=url.username,
                              password=url.password,
                              host=url.hostname,
                              port=url.port)


@contextmanager
def get_db_connection():
    try:
        connection = pool.getconn()
        yield connection
    finally:
        pool.putconn(connection)


@contextmanager
def get_db_cursor(commit=False):
    with get_db_connection() as connection:
        cursor = connection.cursor(cursor_factory=RealDictCursor)
        try:
            yield cursor
            if commit:
                connection.commit()
        finally:
            cursor.close()


# Пример использования
with get_db_cursor() as cursor: 
    cursor.execute("SELECT city, temp_lo, temp_hi, date FROM weather;") 
    data = cursor.fetchone()
    
with get_db_cursor(commit=True) as cursor:
    cursor.callproc("SOME_PROC_NAME")
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы