【问题标题】:raw SQL in django views show errordjango 视图中的原始 SQL 显示错误
【发布时间】:2018-01-03 12:20:24
【问题描述】:

由于某些特殊原因,我们不得不在 view.py 文件中执行原始查询。 (有一些页面是用户键入 SQL 查询并发送它,因此我们的系统应该执行它并显示 tat 查询的结果)

def query(request):
    result = None
    if request.method == "POST":
        form = forms.QueryForm(request.POST)
        if form.is_valid():
            query_text = form.cleaned_data['query']
            with connection.cursor() as cursor:
                try:
                    cursor.execute(query_text)
                    result = cursor.fetchall()
                except:
                    result = cursor.statusmessage
    else:
        form = forms.QueryForm()

    return render(request, "portal/query.html", {
        'form': form,
        'result': result
    })

如果我们运行 SELECT * FROM table1 之类的东西,try 部分将成功运行,如果某些查询不返回某些行,例如 UPDATE,则 except 部分有效。

我的问题是,如果我们执行一些无意义的查询,例如 sakufhskghks,我们希望看到来自 DB 的错误,或者来自 DB 的任何类型的错误。

这可能吗? tnx

【问题讨论】:

  • 用您想要的垃圾句子填充您的 query_text 并执行您的代码。你会得到你发布的问题的答案。
  • 这正是正在发生的事情。我们输入的任何内容都存储在 query_text 中,甚至是垃圾。除了部分运行,但我们看不到来自数据库@RavinderReddy 的消息
  • except 是保存和管理引发的异常。

标签: python mysql sql django


【解决方案1】:

如果您不确定引发的异常,可以从系统中调用通用异常信息。

示例

import sys
....
try:
    # whatever code you want ...
    pass
except OSError as err: # when you know and expect specific error
    # decide what you want to perform
    pass
except ValueError: # when you know and expect specific error
    # decide what you want to perform
    pass
except: # unhandled exceptions
    print("Unexpected error:", sys.exc_info()[0])
    raise

数据库错误也有命名异常。
可以假设相关错误并引发。

参考文档

【讨论】:

    【解决方案2】:

    我认为您需要检查各种异常。 目前,您只是检查是否发生了一些异常,然后打印cursor.statusmessage。当你传递垃圾时,cursor.statusmessage 将不包含任何内容。

    处理各种错误情况的好方法是检查各种数据库异常。

    Various Database Exceptions in Django!!!

    演示代码:

    import django.db as db
    try:
        pass
    except db.OperationalError as e:
        print str(e)
    except db.Error as e:
        print(str(e))
    except:
        result = cursor.statusmessage
    

    【讨论】:

    • 您好,我收到一个 ProgrammingError 的关系已经存在。想捕捉并检查错误,但是 cursor.statusmessage 是空字符串。
    猜你喜欢
    • 2011-08-21
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多