Flask SQLAlchemy: сбой приложения при postgres перезагрузке сервера - PullRequest
2 голосов
/ 05 февраля 2020

У меня есть стандартная настройка flask_sqlalchemy и AWS RDS с postgresql.

. Я инициализирую адаптер DB стандартным способом:

from flask_sqlalchemy import SQLAlchemy
from flask import Flask

app = Flask(__name__)
db = SQLAlchemy()

db.init_app(app)

class Example(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(256))

Если я перезагружаю RDS сервер и SELECT запускается во время перезагрузки. Я получаю:

psycopg2.OperationalError: разрыв соединения из-за команды администратора. SSL-соединение было неожиданно закрыто.

Вышеуказанное исключение было прямой причиной следующее исключение:

sqlalchemy.ex c .OperationalError: (psycopg2.OperationalError) разрыв соединения из-за команды администратора Соединение SSL было неожиданно закрыто

Это я понимаю. БД недоступна.

НО: после этого приложение не может выйти из ситуации, потому что:

sqlalchemy.ex c .InvalidRequestError: Невозможно восстановить соединение, пока недопустимая транзакция не станет откат

Вышеуказанное исключение было прямой причиной следующего исключения: sqlalchemy.ex c .StatementError:

(sqlalchemy.ex c .InvalidRequestError) Невозможно восстановить соединение, пока откат неверной транзакции

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

Но что меня удивляет, так это то, что он никогда не восстанавливается.

Нет транзакции записи в БД! Я не понимаю, какой откат описывает исключение.

Редактировать:

Вот как реализованы все коммиты:

try: 
  db.session.commit() 
except Exception as e:                    
  db.session.rollback()

Но нет фиксации, вызывающей исключение. Только ВЫБОРЫ.

1 Ответ

0 голосов
/ 11 февраля 2020

Сделайте это, и это должно исправить это для вас session.rollback().

Если вы хотите найти эту ошибку, оберните ее в блок try / exception и выполните session.rollback ().

РЕДАКТИРОВАТЬ:

Так что я тестирую некоторые вещи, и я считаю, что причина ошибки лежит в блоке try / исключением. В идеале do c говорит, что вам следует реализовать вставки:

  1. Создать Python объект
  2. Добавить его в сеанс
  3. Зафиксировать сеанс

например,

>>> db.session.add(User(name="Flask", email="example@example.com"))
>>> db.session.commit()

Аналогично для удалений:

>>> db.session.delete(me)
>>> db.session.commit()

Для запросов не требуется фиксировать исключительно, атрибут запроса в Flask -SQLAlchemy делает это для вас в классе Model.

, поэтому для выбора вы просто делаете:

users = User.query.all()

Что в вашем случае:

 something = Example.query.all()

Еще один вещь, не могли бы вы уточнить или дать дополнительную информацию о том, почему вы реализуете коммиты следующим образом:

try: 
  db.session.commit() 
except Exception as e:                    
  db.session.rollback()

PS: Возможно, я неправильно прочитал ваше последнее редактирование, мой плохой!

...