Обработка «Невозможно восстановить соединение, пока не будет выполнен откат недействительной транзакции» - PullRequest
1 голос
/ 26 марта 2020

Я видел другие вопросы, поэтому собираюсь сразу перейти к сути.

Мой сайт - это блог, созданный с flask, поэтому, конечно, я выполняю такие операции, как обновление информации о пользователе, добавление новой загруженные файлы et c.

Я всегда выполнял эти операции, используя app.db, но иногда я получаю ошибку в названии, обычно после нескольких минут бездействия.

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

@contextmanager
def session_scope():
    """Provide a transactional scope around a series of operations."""
    session = db.Session()
    try:
        yield session
        session.commit()
    except:
        session.rollback()
        raise
    finally:
        session.close()

В чем я не уверен, так это где я должен использовать это session_scope(). Например, здесь я обновляю биографию пользователей (description), когда данные отправляются через ajax (это работает нормально):

description = content['description']
description = (description[:max_characters_allowed_bio]) \
    if len(description) > max_characters_allowed_bio else description

if current_user.description.split() != description.split():
    current_user.description = description
    db.session.commit()

Теперь, если я прав, я должен использовать session_scope, так как я делаю операции с базой данных, однако я попытался это безуспешно:

with session_scope() as session:
    description = content['description']
    description = (description[:max_characters_allowed_bio]) \
        if len(description) > max_characters_allowed_bio else description

    if current_user.description.split() != description.split():
        session.query(User).filter_by(id=current_user.id).description = description
        session.commit()

Как мне обновить эту информацию через session_scope?

И опять же, я должен использовать session_scope только при фиксации? Или мне нужно использовать его для других подобных запросов?

Work.query.get_or_404(work_id)
Media.query.filter(Media.path.contains(path)).first().id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...