AttributeError при вставке объекта через SQLAlchemy: у объекта 'int' нет атрибута '_sa_instance_state' - PullRequest
0 голосов
/ 11 января 2019

Я запрашиваю данные через API и сохраняю эти данные JSON в переменных. Цель - сохранить эти данные в базе данных MySQL с помощью SQLAlchemy (Python, Flask).

Текущая загрузка имеет несколько остановок, и каждая остановка может иметь несколько действий. После session.commit () tour_stop_to_add вставляется в базу данных и получает назначенный идентификатор.

Таким образом, идентификатор tour_stop_to_add доступен. Кроме того, тип успешно преобразуется в запрошенное перечисление, а transportOrderNumber также доступен в виде строки.

Типы данных модели эквивалентны типам, предоставленным для создания объекта. Значения dict, сохраненные в 'action', присутствуют и доступны.

Классы для остановки и действия

class TourStop(db.Model):
    __tablename__ = "tour_stop"

    id = db.Column(db.Integer, primary_key=True)

    actions = db.relationship("TourStopAction", backref="tour_stop", lazy=False)


class ActionType(Enum):
    PICKUP = 'PICKUP'
    DELIVERY = 'DELIVERY'


class TourStopAction(db.Model):
    __tablename__ = "tour_stop_action"

    id = db.Column(db.Integer, primary_key=True)

    tour_stop_id = db.Column(db.Integer, db.ForeignKey('tour_stop.id'), nullable=False)

    type = db.Column(db.Enum(ActionType), nullable=False)
    transport_order_number = db.Column(db.String(255), nullable=False)

Извлечение из кода, пытающегося сохранить остановки и действия

for stop in load.get('tourStops'):
    tour_stop_to_add = TourStop(...)
    session.add(tour_stop_to_add)
    session.commit()

    for action in stop.get('actions'):
        tour_stop_action_to_add = TourStopAction(tour_stop=tour_stop_to_add.id, type=ActionType(action.get('type')), transport_order_number=action.get('transportOrderNumber'))
        session.add(tour_stop_action_to_add)

При создании объекта TourStopAction возникает следующая ошибка.

Traceback (most recent call last):
  File "../venv/lib/python3.6/site-packages/flask/app.py", line 2309, in __call__
    return self.wsgi_app(environ, start_response)
  File "../venv/lib/python3.6/site-packages/flask/app.py", line 2295, in wsgi_app
    response = self.handle_exception(e)
  File "../venv/lib/python3.6/site-packages/flask/app.py", line 1741, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "../venv/lib/python3.6/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "../venv/lib/python3.6/site-packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "../venv/lib/python3.6/site-packages/flask/app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "../venv/lib/python3.6/site-packages/flask/app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "../venv/lib/python3.6/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "../venv/lib/python3.6/site-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "../venv/lib/python3.6/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "../views/views.py", line 26, in import_loads_api
    import_loads()
  File "../services/historical_data/import_historical_data.py", line 53, in import_loads
    store_loads(loads_json)
  File "../services/historical_data/import_historical_data.py", line 81, in store_loads
    transport_order_number=action.get('transportOrderNumber'))
  File "<string>", line 4, in __init__

  File "../venv/lib/python3.6/site-packages/sqlalchemy/orm/state.py", line 424, in _initialize_instance
    manager.dispatch.init_failure(self, args, kwargs)
  File "../venv/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py", line 66, in __exit__
    compat.reraise(exc_type, exc_value, exc_tb)
  File "../venv/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 249, in reraise
    raise value
  File "../venv/lib/python3.6/site-packages/sqlalchemy/orm/state.py", line 421, in _initialize_instance
    return manager.original_init(*mixed[1:], **kwargs)
  File "../venv/lib/python3.6/site-packages/sqlalchemy/ext/declarative/base.py", line 748, in _declarative_constructor
    setattr(self, k, kwargs[k])
  File "../venv/lib/python3.6/site-packages/sqlalchemy/orm/attributes.py", line 229, in __set__
    instance_dict(instance), value, None)
  File "../venv/lib/python3.6/site-packages/sqlalchemy/orm/attributes.py", line 815, in set
    value = self.fire_replace_event(state, dict_, value, old, initiator)
  File "../venv/lib/python3.6/site-packages/sqlalchemy/orm/attributes.py", line 835, in fire_replace_event
    state, value, previous, initiator or self._replace_token)
  File "../venv/lib/python3.6/site-packages/sqlalchemy/orm/attributes.py", line 1183, in emit_backref_from_scalar_set_event
    child_state, child_dict = instance_state(child),\
AttributeError: 'int' object has no attribute '_sa_instance_state'

AttributeError: у объекта 'int' нет атрибута '_sa_instance_state'

Пожалуйста, попробуйте помочь, как я могу успешно создать и сохранить tour_stop_to_add.

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