SQL Алхимия session.commit и поведение при сбросе - PullRequest
0 голосов
/ 03 мая 2020

Я работаю с большой кодовой базой, используя SQL Алхимия. Недавно мы перешли на structlog для ведения журнала, и поведение SQLAlchemy изменилось. В функциях, где данные вставляются в MySQL, если вызов session.commit () находится перед оператором журнала И не в предложении finally, объект становится None.

model_obj пуст, когда возвращается в следующем код:

    model_obj = json.loads(model_serialized, object_hook=from_json)

try:
    session.add(model_obj)
    session.commit()
    config.logger.debug("added model_obj", model_obj=model_obj)
except IntegrityError as e:
    config.logger.debug("model_obj already exists", model_obj=model_obj, e=str(e))
    return createAndEncodeErrorElements(
        ErrorCodeDatabaseSQLAlchemyIntegrityError, None
    )
else:
    response = createAndEncodeSuccessElementsWithData({model_obj: model_obj})
    return response
finally:
    session.close()

model_obj НЕ пуст, когда возвращается в следующем коде: model_obj = json .loads (model_serialized, object_hook = from_ json)

try:
    session.add(model_obj)
    config.logger.debug("added model_obj", model_obj=model_obj)
except IntegrityError as e:
    config.logger.debug("model_obj already exists", model_obj=model_obj, e=str(e))
    return createAndEncodeErrorElements(
        ErrorCodeDatabaseSQLAlchemyIntegrityError, None
    )
else:
    response = createAndEncodeSuccessElementsWithData({model_obj: model_obj})
    return response
finally:
    session.commit()
    session.close()

Почему session.commit () должен быть в предложении finally? Каково основное поведение SQLAlchemy?

1 Ответ

1 голос
/ 03 мая 2020

SQLAlchemy истекает все объекты в сеансе, когда сеанс фиксируется. То есть все атрибуты столбца-значения экземпляра модели удаляются из его __dict__

. Этого можно избежать, передав expire_on_commit=False при создании сеанса; Имейте в виду, что данные в экземплярах с истекшим сроком действия могут устареть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...