Соединение SQLAlchemy с SQL Server (pyodbc) остается в спящем режиме после завершения запроса в FastAPIPython

Программы на Python
Ответить
Anonymous
 Соединение SQLAlchemy с SQL Server (pyodbc) остается в спящем режиме после завершения запроса в FastAPI

Сообщение Anonymous »

Я разрабатываю приложение с использованием Python, FastAPI, SQLAlchemy, SQL Server и pyodbc. Всякий раз, когда я выполняю какое-либо действие с базой данных (например, INSERT или SELECT), соединение остается активным в базе данных в состоянии «спящего режима», даже после того, как я явно фиксирую транзакцию и закрываю сеанс.
Я заметил, что в средах Java такого поведения обычно не происходит (соединения закрываются немедленно, если @Transaction не сохраняет их открытыми), поэтому я нахожу такое поведение в Python странным.
Я подозреваю, что это может быть связано с Пул соединений SQLAlchemy сохраняет соединения для повторного использования. Я попытался отключить пул соединений (с помощью NullPool), но соединение по-прежнему остается «спящим» в базе данных.
Вот моя настройка data.py:

Код: Выделить всё

# Session configuration
SessionLocal = sessionmaker(
autocommit=False,
autoflush=False,
expire_on_commit=False,
bind=Engine
)

def get_db() -> Generator[Session, None, None]:
db = SessionLocal()
try:
yield db
except Exception as e:
print(f"Error in session: {e}")
db.rollback()
raise e
finally:
print("Closing database session.")
db.close()
А вот фрагмент моего контроллера/логики, в котором я сохраняю данные:

Код: Выделить всё

# Inside a FastAPI route
integracao_data = IntegracaoPDVCreate(
idEstabelecimento=id_estabelecimento_fixo,
tipo=tipo_arquivo,
dadosArquivo=texto
)

# CRUD operation
db_item = crud.create_integracao_pdv(db=db, item=integracao_data)

# Critical Commit
db.commit()

# Refresh the item (starts a new implicit transaction/select?)
db.refresh(db_item)
Вопросы:
  • Это нормально для SQLAlchemy с pyodbc оставлять соединения в «спящем» состоянии даже после вызова db.close() в блокеfinally?
  • Сохраняет ли db.refresh(db_item) соединение открытым после совершить?
  • Как убедиться, что соединение физически закрыто или правильно возвращено в пул, не оставляя артефактов в SQL Server?
Среда:
  • Python 3.x
  • FastAPI
  • SQLAlchemy
  • SQL Server
  • Драйвер: Драйвер ODBC 17 для SQL Server


Подробнее здесь: https://stackoverflow.com/questions/798 ... quest-fini
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»