Ошибка DetachedInstanceError: экземпляр не привязан к сеансу; операция обновления атрибута не может быть продолжена

#python #flask #flask-sqlalchemy

#питон #фляжка #flask-sqlalchemy

Вопрос:

Спасибо за чтение.

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

Это полная трассировка стека ошибки:

 sqlalchemy.orm.exc.DetachedInstanceError

DetachedInstanceError: Instance <Event at 0x7f514c79bc10> is not bound to a Session; attribute refresh operation cannot proceed
Traceback (most recent call last)

    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 2000, in __call__

    return self.wsgi_app(environ, start_response)

    File "/usr/local/lib/python2.7/dist-packages/werkzeug/contrib/fixers.py", line 152, in __call__

    return self.app(environ, start_response)

    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1991, in wsgi_app

    response = self.make_response(self.handle_exception(e))

    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1567, in handle_exception

    reraise(exc_type, exc_value, tb)

    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1988, in wsgi_app

    response = self.full_dispatch_request()

    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1641, in full_dispatch_request

    rv = self.handle_user_exception(e)

    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1544, in handle_user_exception

    reraise(exc_type, exc_value, tb)

    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1639, in full_dispatch_request

    rv = self.dispatch_request()

    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1625, in dispatch_request

    return self.view_functions[rule.endpoint](**req.view_args)

    File "/home/rodda/workspace/turbo-guacamole/app/authentication_methods.py", line 44, in check_user

    return func(*args, **kwargs)

    File "/home/rodda/workspace/turbo-guacamole/app/admin_views.py", line 63, in admin_publicize

    start_time = event.start_time

    File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/attributes.py", line 237, in __get__

    return self.impl.get(instance_state(instance), dict_)

    File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/attributes.py", line 578, in get

    value = state._load_expired(state, passive)

    File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/state.py", line 474, in _load_expired

    self.manager.deferred_scalar_loader(self, toload)

    File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/loading.py", line 610, in load_scalar_attributes

    (state_str(state)))

    DetachedInstanceError: Instance <Event at 0x7f514c79bc10> is not bound to a Session; attribute refresh operation cannot proceed
 

Код, который генерирует эту ошибку, выглядит следующим образом:

 events = models.Event.query.filter_by(classification = 'ais').all()
for event in events:
    start_time = event.start_time
 

Я запрашиваю события из многих других частей моего приложения Flask и не сталкиваюсь с проблемами. Проблема существует только тогда, когда я запрашиваю конкретные события с их классификацией, установленной как ais.

Однако самое интересное, что когда я запускаю тот же точный код в оболочке Python, он не выдает ошибку.

Не было никакой разницы в том, как я создавал эти события, от того, как я создавал другие события.

Идеи?

Большое вам спасибо.

PS Желательно, чтобы я не хотел перезагружать все эти события (их около 400). Если есть способ исправить это, не воссоздавая их все, это было бы предпочтительнее.

Ответ №1:

события — это список

  start_time = []
 events = models.Event.query.filter_by(classification = 'ais').all()
 for event in events:
     start_time.append(event.start_time)  
 

это дает вам список всех событий.start_time .

Комментарии:

1. Я думаю, вы обнаружили ошибку в логике MRE, которая не связана с этой проблемой.