sqlalchemy NullPool, похоже, не закрывает базовое соединение DBAPI - PullRequest
0 голосов
/ 25 февраля 2020

Если я правильно понимаю документацию, сеанс создает или извлекает существующее соединение из пула. После закрытия соединения оно возвращается в пул соединений, но соединение с DBAPI не закрывается. Чтобы закрыть соединение DBAPI, мне нужно использовать NullPool.
Я пытался проверить правильность моего понимания, но, похоже, что-то не так. Я могу открыть сеанс даже после создания подключений с помощью NullPool.

Ниже приведен пример кода, в котором есть два подключения: одно без NullPool и одно с NullPool.

from time import sleep
from sqlalchemy.orm import sessionmaker
from sqlalchemy.pool import NullPool
from sqlalchemy import create_engine

con_str = 'postgresql+psycopg2://pgusr:pgusr@docker-db.appnet/iamdb'

all_connections = [
    create_engine(con_str),
    create_engine(con_str, poolclass=NullPool),
]


def get_qry(ssn_rows):
    return f'SELECT * FROM users LIMIT {ssn_rows}'


def get_ssn(cnx):
    SessionClass = sessionmaker(bind=cnx)
    return SessionClass()

def test_ssn(ssn, records):
    print('')
    print(list(ssn.execute(get_qry(records))))


for cnx in all_connections:
    ssn = get_ssn(cnx)
    test_ssn(ssn, 3)
    ssn.close()
    sleep(1.5)
    ssn = get_ssn(cnx)
    test_ssn(ssn, 5)

Выше Код, успешно выполненный, где я ожидал, во второй итерации (где выбрано соединение NullPool) должен выдать ошибку при попытке создать сеанс во второй раз, т.е. после закрытия первого сеанса, потому что в случае NullPool соединение с DBAPI также должен был закрыться. Однако, напротив, оба соединения смогли открыть несколько сеансов.

Я что-то здесь упустил? Как мне закрыть соединение с DBAPI после закрытия сеанса?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...