我在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时,activated会被更改,dB会像我想要的那样更新,并且我会看到一条成功消息。问题是,如果activate_code不存在和/或无效,我仍然会收到成功消息。
如果在WHERE中找不到activate_code,如何让此查询引发异常
UPDATE
语句如果不做任何更改,则仍然被认为是成功的。您告诉数据库,只要找到某个值,就要进行更改;这个值在任何地方都找不到,所以没有进行任何更改。它完全按照你的要求做了。
如果要检查以确保进行了更改,可以使用光标对象的.rowcount
属性:
此只读属性指定最后一个.execute*()生成(用于
SELECT
等DQL语句)或受影响(对于像UPDATE
或INSERT
这样的DML语句)。
执行更新语句后,如果且仅当WHERE
子句中的谓词匹配时,cursor.rowcount > 0
将为true。这意味着您的更新已成功。
与您的具体问题无关,我建议您不要使用try,除非您的代码示例中显示的那样。最好只换行一行,只捕获可以处理的错误。如果您希望调用作用域处理错误,那么在调用作用域中捕获它(或者在执行任何必要的日志记录/内务处理后在函数中重新引发它),而不是抑制它并返回异常对象。