Использование экземпляра SQLAlchemy после закрытия сессии - PullRequest
1 голос
/ 31 мая 2019

Можно ли получить доступ к экземпляру SQLAlchemy после закрытия сеанса? Я просто хочу получить доступ к атрибутам экземпляра, а не изменить их значение.

Использование одного сеанса во время выполнения решило бы проблему, но является ли это хорошей практикой? (Принимая во внимание, что программа может работать несколько дней)

Пример кода:

crud.py

@contextmanager
def session_scope():
    session = Session()
    try:
        yield session
        session.commit()
    except Exception:
        session.rollback()
        raise
    finally:
        session.close()

accessdb.py

class AccessDB(object):
    def add_user(self, name, password, is_admin=False):
        with session_scope() as s:
            user = User(username=name, password=password, is_admin=is_admin)
            s.add(user)

    def remove_user(self, username):
        with session_scope() as s:
            s.query(User).filter_by(username=username).delete()

    def list_users(self):
        with session_scope() as s:
            return s.query(User).all()


if __name__ == '__main__':
    a = AccessDB()
    a.add_user("user1", "123")
    a.add_user("user2", "123")
    a.remove_user("user1")
    users = a.list_users()
    print(users[0].username)

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

sqlalchemy.orm.exc.DetachedInstanceError: Instance <User at 0x31df350> is not bound to a Session; attribute refresh operation cannot proceed (Background on this error at: http://sqlalche.me/e/bhk3)

1 Ответ

0 голосов
/ 31 мая 2019

Методы типа commit() или rollback() заставляют все объекты истекать.Чтобы обновить объект, вы должны использовать session.refresh(users[0]).После этого вы снова сможете получить доступ к атрибутам объектов.

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