【问题标题】:Raise Exception when WHERE doesn't exist during UPDATE query在 UPDATE 查询期间 WHERE 不存在时引发异常
【发布时间】:2015-07-08 17:49:17
【问题描述】:

我在一个 API 项目中使用 MySQLdb / Python 时遇到了问题:

def activate_acct(act_link):

    # connect
    db = MySQLdb.connect(host=DB_HOST, user=DB_USER, passwd=DB_PASS,  db=DB_NAME)

    # create a database cursor
    cursor = db.cursor()

    try:
        sql = """UPDATE users
        SET activated = %s
        WHERE activate_code = %s"""

        cursor.execute(sql, (1, act_link))
        db.commit()

        return "Activated"

    except Exception as e:

        return e

查询有效,因为当找到 activate_code 时,激活被更改,分贝按照我想要的方式更新,我看到一条成功消息。问题是如果 activate_code 不存在和/或无效,我仍然会收到成功消息。

如果在 WHERE 中找不到 activate_code,如何让此查询引发异常?

【问题讨论】:

  • 您能否添加更多代码/示例?这只是查询。你必须在某个地方执行它。您必须填写参数。这应该是代码摘录的一部分。
  • 我添加了我认为相关的内容。很抱歉把它写得很短。

标签: python mysql sql mysql-python


【解决方案1】:

没有任何改变的UPDATE 语句仍然被认为是成功的。您告诉数据库在找到某个值的地方进行更改;该值无处可寻,因此无处进行更改。它完全按照您的要求完成了。

如果您想检查以确保进行了更改,可以使用the .rowcount attribute of a cursor object

这个只读属性指定了最后的行数 .execute*() 产生(对于像 SELECT 这样的 DQL 语句)或受影响 (对于像 UPDATEINSERT 这样的 DML 语句)。

执行更新语句后,当且仅当WHERE 子句中的谓词匹配时,cursor.rowcount > 0 才会为真。这意味着您的更新已成功。

与您的具体问题无关,我建议您不要使用代码示例中所示的 try-except。最好只包装一行并只捕获您可以处理的错误。如果您打算让调用范围处理错误,则在调用范围中捕获它(或在执行任何必要的日志记录/内务处理后在函数中重新引发它)而不是抑制它并返回异常对象。

【讨论】:

  • 听起来是个聪明的解决方案。我今天上班时检查一下。
  • 很棒的提示。我的老板/sql 专家印象深刻。谢谢。
猜你喜欢
  • 1970-01-01
  • 2016-05-16
  • 2014-12-28
  • 2021-08-16
  • 1970-01-01
  • 1970-01-01
  • 2020-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多