首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何返回Flask-SqlAlchemy错误详细信息

如何返回Flask-SqlAlchemy错误详细信息
EN

Stack Overflow用户
提问于 2019-05-26 22:03:33
回答 2查看 4.3K关注 0票数 2

我使用的是Flask 1.0Flask-SqlAlchemy 2Angular 7

当SqlAlchemy抛出一个错误时,我想在前端显示一个定制的错误消息。

official Flask documentation中有一个关于如何处理错误的部分,还有一个关于SO的similar question,它与Flask-Restless相关。但我还是不能把这些点联系起来。

当SqlAlchemy抛出一个错误时,它看起来像这样:

代码语言:javascript
运行
复制
DETAIL:  Key (id)=(123) is not present in table "foo".

我将错误返回给路由:

代码语言:javascript
运行
复制
try:
    db.session.commit()
except Exception as error:
    db.session.flush()
    db.session.rollback()
    return error

在路由中,我检查它是否是一个错误:

代码语言:javascript
运行
复制
if status == True:
    return jsonify( { "success": True } ), 201
else:
    return error_response(500, str(status))

我的error_response类看起来像这样:

代码语言:javascript
运行
复制
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只包含一个通用的错误消息:

代码语言:javascript
运行
复制
"message": "Http failure response for http://127.0.0.1:5000/database/add_foo: 0 Unknown Error"
EN

回答 2

Stack Overflow用户

发布于 2019-05-26 23:30:06

您可以读取error对象并从中创建您自己的自定义消息。有关所有详细信息,请尝试在控制台中打印error.\__dict__

例如:

代码语言:javascript
运行
复制
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))

输出将为:-

票数 2
EN

Stack Overflow用户

发布于 2019-06-09 03:24:27

原来错误是在我尝试进行批量保存时返回的:

代码语言:javascript
运行
复制
db.session.bulk_save_objects(companies_to_add, return_defaults = True)

我的印象是,在执行以下任一操作时都会引发错误

代码语言:javascript
运行
复制
db.session.commit()

代码语言:javascript
运行
复制
db.session.flush()

很明显,我错了。我现在将批量保存放在try块中:

代码语言:javascript
运行
复制
try:
    db.session.bulk_save_objects(companies_to_add, return_defaults = True)
except Exception as error:
    db.session.rollback()
    return error

现在我可以在前端捕获错误了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56314204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档