我使用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,我怎么能让这个查询引发异常?
答案 0 :(得分:1)
仍然认为没有任何更改的UPDATE
语句是成功的。您告诉数据库在发现某个值的任何地方进行更改;这个价值无处可寻,所以改变无处可去。它完全按照你的要求行事。
如果您想检查以确保进行了更改,可以使用the .rowcount
attribute of a cursor object:
此只读属性指定最后一行的行数 生成.execute *()(对于像
SELECT
这样的DQL语句)或受影响 (适用于UPDATE
或INSERT
等DML语句。
执行更新语句后,当且仅当cursor.rowcount > 0
子句中的谓词匹配时,WHERE
才为真。这意味着您的更新成功。
与您的具体问题无关,我建议不要使用try-except,如代码示例所示。最好只包装一行,只捕获你可以处理的错误。如果您打算让调用范围处理错误,那么在调用范围内捕获它(或在执行任何必要的日志记录/内务处理后在函数中重新提升它),而不是抑制它并返回异常对象。