Многопроцессорная обработка с Flask SQLAlchemy - ошибка со статусом PGRES_TUPLES_OK и отсутствие сообщения от libpq - PullRequest
1 голос
/ 30 апреля 2020

Я сталкиваюсь с приведенной ниже ошибкой при использовании Python Многопроцессорная обработка с Flask -SQLalchemy.

Если я вызываю приведенный ниже метод, показанный в целевой части, без многопроцессорной обработки, он работает нормально.

Это сообщение об ошибке:

Error seen in LOGS:
sqlalchemy.exc.ResourceClosedError: This result object does not return rows. It has been closed automatically.
[12/Aug/2019 18:09:52] "GET /api/resources HTTP/1.1" 500 -
Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/SQLAlchemy-1.3.6-py3.7-linux-x86_64.egg/sqlalchemy/engine/base.py", line 1244, in _execute_context
cursor, statement, parameters, context
File "/usr/local/lib/python3.7/site-packages/SQLAlchemy-1.3.6-py3.7-linux-x86_64.egg/sqlalchemy/engine/default.py", line 552, in do_execute
ursor.execute(statement, parameters)
psycopg2.DatabaseError: error with status PGRES_TUPLES_OK and no message from the libpq

Это фрагмент кода, который использует многопроцессорную обработку в python

# code snippet
work = multiprocessing.Process(target=<some_method_long_running_has_db_operations_in_this>,
                               args(args1,),
                               name='PROCESS-' + self.user_key, daemon=False)

work.start()
return Response("Request Fulfilled", status=202)

Информация о подключении к базе данных

# This is how I use DB Session. The project contains the following files.

`db_utils.py`
# Initializing the SQLAlchemy object
db = SQLAlchemy()

Здесь я снова импортирую db, чтобы использовать их для моделей.

# Flask Model classes created in the project.
from db_utils import db
class A(db.Model):
    __tablename__ = 'some_table'
    __table_args__ = {'schema': db_schema}

    id = db.Column(db.Text, primary_key=True, server_default=db.FetchedValue())
    col1 = db.Column(db.Text)
    col2 = db.Column(db.Integer)

В файлах бизнес-логики c: так я пишу в БД

Businesslogic.py

# Here, in this class, I again import db to call db.session etc
from db_utils import db

db.session.add(some_obj)
db.session.commit()
...