SQLAlchemy и FastAPI выдают ошибку «Потеряно соединение с сервером MySQL во время запроса» ⇐ Python
-
Гость
SQLAlchemy и FastAPI выдают ошибку «Потеряно соединение с сервером MySQL во время запроса»
Я создаю API Python, используя FastAPI с SQLAlchemy, у меня не возникло никаких проблем в моей локальной среде, но проблема возникла, когда моя команда тестировала API в среде контроля качества с несколькими пользователями одновременно, иногда конечные точки не выдают никаких ошибок, но в некоторых случаях я получал эту ошибку:
ОШИБКА:sqlalchemy.pool.impl.QueuePool:Исключение во время сброса или аналогичного Traceback (последний вызов последний): Файл "/home/pogen/Informatica/envs/retail-api/lib/python3.11/site-packages/sqlalchemy/pool/base.py", строка 988, в _finalize_fairy фея._reset( Файл "/home/pogen/Informatica/envs/retail-api/lib/python3.11/site-packages/sqlalchemy/pool/base.py", строка 1436, в _reset пул._dialect.do_rollback(сам) Файл "/home/pogen/Informatica/envs/retail-api/lib/python3.11/site-packages/sqlalchemy/engine/default.py", строка 691, в do_rollback dbapi_connection.rollback() Файл "/home/pogen/Informatica/envs/retail-api/lib/python3.11/site-packages/mysql/connector/connection_cext.py", строка 517, при откате self._cmysql.rollback() Это пример структуры проекта:
. └── корневая_папка/ ├── Connection.py ├── методы.py └── endpoints.py
Сначала я определяю механизм и функцию для получения SQLAlchemy Seesion в файле connection.py
из импорта sqlalchemy create_engine, URL из sqlalchemy.orm импортировать создатель сеанса data_url = URL.create( "Мариадб+mysqlконнектор", имя пользователя = 'мое_имя_пользователя', пароль = 'мой_пароль', хост = 'db_host', порт = 3306, база данных = 'some_database' ) Database_engine = create_engine (database_url) def db_connection() -> Сеанс: пытаться: db_session = создатель сеанса (bind = Database_engine) сеанс = db_session() сессия доходности окончательно: сеанс.закрытие() Файл methods.py содержит все операции с базой данных, здесь я вызываю функцию db_connection внутри конструктора класса:
из Connection.py импортировать db_connection Ученик класса: защита __init__(сам): self.session = следующий (db_connection()) защита get(std_id): проходить .... Наконец, в файле endpoints.py. В функции я создаю экземпляр класса как одну зависимость для выполнения всех операций:
из импорта fastapi APIRouter, Depends, Query из метода.py импортировать студента от ввода импорта с аннотациями маршрутизатор = APIRouter(prefix='/student') @router.get('/search_student/') async def search_student(std_id: Annotated[int,Query(description='Student ID')], Student_object : Annotated[Студент, Зависит(Студент)]): my_student = Student_object.get(std_id) вернуть мой_студент Я уже пробовал добавить пул в движок, но получаю ту же ошибку
database_engine = create_engine(database_url,pool_size=20, max_overflow=10)
Я создаю API Python, используя FastAPI с SQLAlchemy, у меня не возникло никаких проблем в моей локальной среде, но проблема возникла, когда моя команда тестировала API в среде контроля качества с несколькими пользователями одновременно, иногда конечные точки не выдают никаких ошибок, но в некоторых случаях я получал эту ошибку:
ОШИБКА:sqlalchemy.pool.impl.QueuePool:Исключение во время сброса или аналогичного Traceback (последний вызов последний): Файл "/home/pogen/Informatica/envs/retail-api/lib/python3.11/site-packages/sqlalchemy/pool/base.py", строка 988, в _finalize_fairy фея._reset( Файл "/home/pogen/Informatica/envs/retail-api/lib/python3.11/site-packages/sqlalchemy/pool/base.py", строка 1436, в _reset пул._dialect.do_rollback(сам) Файл "/home/pogen/Informatica/envs/retail-api/lib/python3.11/site-packages/sqlalchemy/engine/default.py", строка 691, в do_rollback dbapi_connection.rollback() Файл "/home/pogen/Informatica/envs/retail-api/lib/python3.11/site-packages/mysql/connector/connection_cext.py", строка 517, при откате self._cmysql.rollback() Это пример структуры проекта:
. └── корневая_папка/ ├── Connection.py ├── методы.py └── endpoints.py
Сначала я определяю механизм и функцию для получения SQLAlchemy Seesion в файле connection.py
из импорта sqlalchemy create_engine, URL из sqlalchemy.orm импортировать создатель сеанса data_url = URL.create( "Мариадб+mysqlконнектор", имя пользователя = 'мое_имя_пользователя', пароль = 'мой_пароль', хост = 'db_host', порт = 3306, база данных = 'some_database' ) Database_engine = create_engine (database_url) def db_connection() -> Сеанс: пытаться: db_session = создатель сеанса (bind = Database_engine) сеанс = db_session() сессия доходности окончательно: сеанс.закрытие() Файл methods.py содержит все операции с базой данных, здесь я вызываю функцию db_connection внутри конструктора класса:
из Connection.py импортировать db_connection Ученик класса: защита __init__(сам): self.session = следующий (db_connection()) защита get(std_id): проходить .... Наконец, в файле endpoints.py. В функции я создаю экземпляр класса как одну зависимость для выполнения всех операций:
из импорта fastapi APIRouter, Depends, Query из метода.py импортировать студента от ввода импорта с аннотациями маршрутизатор = APIRouter(prefix='/student') @router.get('/search_student/') async def search_student(std_id: Annotated[int,Query(description='Student ID')], Student_object : Annotated[Студент, Зависит(Студент)]): my_student = Student_object.get(std_id) вернуть мой_студент Я уже пробовал добавить пул в движок, но получаю ту же ошибку
database_engine = create_engine(database_url,pool_size=20, max_overflow=10)