Если я правильно понимаю документацию, сеанс создает или извлекает существующее соединение из пула. После закрытия соединения оно возвращается в пул соединений, но соединение с 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 после закрытия сеанса?