Как вернуть сведения об ошибке Flask-SqlAlchemy - PullRequest
0 голосов
/ 26 мая 2019

Я использую Flask 1.0 , Flask-SqlAlchemy 2 и Angular 7 .

Когда SqlAlchemy выдает ошибку, я хочупоказать специальное сообщение об ошибке во внешнем интерфейсе.

В официальной документации Flask есть раздел о том, как обрабатывать ошибки, а также аналогичный вопрос здесь, на SO,это связано с Flask-Restless .И все же я не могу соединить точки.

Когда SqlAlchemy выдает ошибку, это выглядит примерно так:

DETAIL:  Key (id)=(123) is not present in table "foo".

Я возвращаю ошибку в маршрут:

try:
    db.session.commit()
except Exception as error:
    db.session.flush()
    db.session.rollback()
    return error

В маршруте я проверяю, есть ли ошибка:

if status == True:
    return jsonify( { "success": True } ), 201
else:
    return error_response(500, str(status))

И мой класс error_response выглядит так:

def error_response(status_code, message=None):
    payload = {"error": HTTP_STATUS_CODES.get(status_code, "Unknown error")}
    if message:
        payload["message"] = message
        response = jsonify(payload)
        response.status_code = status_code
    return response

Но ответjson просто содержит общее сообщение об ошибке:

"message": "Http failure response for http://127.0.0.1:5000/database/add_foo: 0 Unknown Error"

Ответы [ 2 ]

1 голос

Вы можете прочитать объект error и создать из него свое собственное сообщение. для всех деталей попробуйте распечатать error.\__dict__ в консоли.

erro.__dict__

например:

from sqlalchemy import create_engine
from sqlalchemy import MetaData
from sqlalchemy import Table
from sqlalchemy import Column
from sqlalchemy import Integer, String

db_uri = 'sqlite:///'
engine = create_engine(db_uri)
conn = engine.connect()

# Create a metadata instance
meta = MetaData(engine)
table = Table('user', meta,
   Column('id', Integer, primary_key=True),
   Column('l_name', String),
   Column('f_name', String))
meta.create_all()
# Insert Data
conn.execute(table.insert(),[
   {'id':1,'l_name':'Hi','f_name':'bob'},
   {'id':2,'l_name':'Hello','f_name':'john'},
   {'id':3,'l_name':'yo','f_name':'bob-john'}])

result =conn.execute("SELECT * FROM user")
for res in result:
  print(res)
# Intensionally violating unique constraint
try:
  ins = table.insert().values(
      id=3,
      l_name='Hello',
      f_name='World')
# conn = engine.connect()
  conn.execute(ins)
except Exception as error:
  print(str(error.orig) + " for parameters" + str(error.params))

вывод будет: -

Custom Exception Message

0 голосов
/ 08 июня 2019

Оказывается, ошибка была возвращена, когда я пытался сделать массовое сохранение:

db.session.bulk_save_objects(companies_to_add, return_defaults = True)

У меня сложилось впечатление, что при выполнении одного или 1004 просто возникнет ошибка

db.session.commit()

или

db.session.flush()

Очевидно, я был неправ. Теперь я помещаю массовое сохранение в блок try:

try:
    db.session.bulk_save_objects(companies_to_add, return_defaults = True)
except Exception as error:
    db.session.rollback()
    return error

Теперь я могу отловить ошибку во внешнем интерфейсе.

...