在UPDATE查询期间不存在WHERE时引发异常

时间:2015-04-29 12:29:36

标签: python mysql sql mysql-python

我使用MySQLdb / Python进行API项目并遇到了问题:

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时,激活被更改,dB会像我想要的那样更新,并且我看到成功消息。问题是如果activate_code不存在和/或无效,我仍然会收到成功消息。

如果在WHERE找不到activate_code,我怎么能让这个查询引发异常?

1 个答案:

答案 0 :(得分:1)

仍然认为没有任何更改的UPDATE语句是成功的。您告诉数据库在发现某个值的任何地方进行更改;这个价值无处可寻,所以改变无处可去。它完全按照你的要求行事。

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

  

此只读属性指定最后一行的行数   生成.execute *()(对于像SELECT这样的DQL语句)或受影响   (适用于UPDATEINSERT等DML语句。

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

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