Ошибка 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):

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

class Model_X(Model_Y):
..
..
..
def status(self, model_run_id: str):
try:
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 Model_X.status(): model_run_id unknown"
)
except Exception as e:
logger.error(f'Exception in status method: {str(e)}')
return ModelRunInfo(
model_run_id=model_run_id,
state=ModelState.ERROR,
reason=f"Exception: {str(e)}"
)
Внутри 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 описан ниже:

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

import sqlalchemy as sa
.
.
class AccessImporter:
..
..
..
def connect_to_access(self, access_file: str):
try:
#access_file = r'C:\data\git\aimms-adapter\esdl2opera_access\Opties_mmvib.mdb'
odbc_string = r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=' + access_file + ';'

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

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

Import gc
.
.
class AccessImporter:
..
..
..
def disconnect(self):
log.info("Disconnecting database")
self.cursor.close()
self.conn.close()
garbage_collected = gc.collect()
log.info(f'amount of garbage collected is {garbage_collected}')
Краткое описание ошибки следующее:

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

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), я не получил никаких ошибок.
Модель основана на AIMMS, поэтому необходимо использовать базу данных доступа ( поэтому соответствующий драйвер). Поэтому я не могу перейти на другие надежные базы данных, такие как PostgreSQL, SQLite и т. д.
Настройка моей среды:

< li>Версия SQLAlchemy: 2.0.34
[*]Версия Python: 3.11.5
[*]Версия MySQL: 8.0.0


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

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

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

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

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

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