Ошибка Python: ошибка вызова API адаптера модели: pyodbc.OperationalError '[08004] (-1036) (SQLDriverConnect)Python

Программы на Python
Anonymous
Ошибка Python: ошибка вызова API адаптера модели: pyodbc.OperationalError '[08004] (-1036) (SQLDriverConnect)

Сообщение Anonymous »

Я запускаю адаптер модели через приложение. После активации приложения я пытаюсь протестировать вызовы API. Первый тестовый запуск API работает правильно. Тестирование вызовов API во второй раз (поддержание активности приложения) вызывает ошибки. Ошибка возникает в одном из промежуточных вызовов, когда адаптер пытается подключиться к базе данных доступа.
Этот вызов API работает следующим образом:
< ul>
[*]Описание:
Вызов для получения статуса модели

[*]Возвраты:
  • model_run_id
  • Состояние модели: ПРИНЯТО, ОЖИДАЕТСЯ , В ОЧЕРЕДИ, ВЫПОЛНЯЕТСЯ, УСПЕШНО, ОШИБКА
  • причина: описание в случае состояния ОШИБКА

Вызов API закодирован следующим образом:

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

@api.route("/status/")
class Status(MethodView):

@api.response(200, ModelRunInfo.Schema())
def get(self, model_run_id: str):
res = opera.status(model_run_id=model_run_id)
return jsonify(res)
API вызывает следующий метод внутри адаптера (назовем эту модель оболочки Model_X_Y):

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

Class Model_X(Model_Y):
..
..
..
def status(self, model_run_id: str):
if model_run_id in self.model_run_dict:
if not executor.futures.done(model_run_id):
return ModelRunInfo(
state=self.model_run_dict[model_run_id].state,
model_run_id=model_run_id,
reason=f"executor.futures._state: {executor.futures._state(model_run_id)}"
)
else:
#print("executor.futures._state: ", executor.futures._state(model_run_id))   # FINISHED
future = executor.futures.pop(model_run_id)
executor.futures.add(model_run_id, future)   # Put it back on again, so it can be  retreived in results
model_run_info = future.result()
if model_run_info.result is not None:
print('Model execution result:', model_run_info.result)
else:
logger.warning("No result in model_run_info variable")
return model_run_info
else:
return ModelRunInfo(
model_run_id=model_run_id,
state=ModelState.ERROR,
reason="Error in ESSIM.status(): model_run_id unknown"
)
Внутри Model_Y тот же метод определен следующим образом:

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

Class Model_Y:
..
..
..
def status(self, model_run_id: str):
if model_run_id in self.model_run_dict:
# Dummy behaviour: Query status once, to let finish model
self.model_run_dict[model_run_id].state = ModelState.SUCCEEDED

return ModelRunInfo(
state=self.model_run_dict[model_run_id].state,
model_run_id=model_run_id,
)
else:
return ModelRunInfo(
model_run_id=model_run_id,
state=ModelState.ERROR,
reason="Error in Model.status(): model_run_id unknown"
)

Метод подключения к драйверу Microsoft Access описан ниже:

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

def connect_to_access(self, access_file: str):
odbc_string = r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=' + access_file + ';'

print(f"Connecting to database {access_file}")
connection_url = sqlalchemy.engine.URL.create(
"access+pyodbc",
query={"odbc_connect": odbc_string}
)
# pyodbc.connect(odbc_string)
self.engine = sqlalchemy.create_engine(connection_url, pool_pre_ping=True)
self.engine.connect()
self.conn = self.engine.raw_connection()
self.cursor = self.conn.cursor()
Метод отключения доступа описан ниже:

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

def disconnect(self):
log.info("Disconnecting database")
self.cursor.close()
self.conn.close()
Краткое описание ошибки следующее:

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

OperationalError: (pyodbc.OperationalError) ('08004', '[08004] [Microsoft][ODBC Microsoft Access Driver] Too many client tasks. (-1036) (SQLDriverConnect)')\n(Background on this error at: https://sqlalche.me/e/20/e3q8)"
Я попытался изучить переполнение стека, чтобы найти похожие проблемы. Однако я обнаружил, что мое соединение использует другой пакет. Я также перешел по ссылке в описании ошибки. Однако я по-прежнему получаю ту же ошибку.
Я намерен запускать вызовы API без каких-либо проблем, поскольку приложение должно всегда работать в фоновом режиме. В настоящее время мне приходится полностью останавливать приложение и перезапускать его снова и снова, чтобы не получить ошибок при тестировании API.
К вашему сведению: я не создавал это приложение или вызовы API. Я являюсь пользователем адаптера модели.
Другая важная информация: В моей среде установлены как 32-разрядные, так и 64-разрядные драйверы Microsoft Access, при этом установлена ​​64-разрядная версия. И модель, и адаптер размещаются в моей собственной среде. Когда я тестировал методы Connect_to_access и Disconnect (т. е. без использования вызовов API), я не получил никаких ошибок.

Подробнее здесь: https://stackoverflow.com/questions/790 ... or-08004-1

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