【问题标题】:How to catch when SQL UPDATE SETs not existing line当 SQL UPDATE SETs 不存在行时如何捕获
【发布时间】:2015-11-07 19:34:40
【问题描述】:

我正在使用 Flask 和 MySQL 进行开发。 问题是: 我有这个值的测试表 编号 |资源名称 | +----+--------------+ | 1 |谷歌 | | 2 |谷歌 | | 3 |谷歌 | | 4 |谷歌 |

在 Python 中我有这个:

def edit_resource(res_name, res_id):
    with db_pool().manager() as conn:
        cursor = conn.cursor()
        sql = """UPDATE `resource` SET `resource_name` = %s WHERE id = %s;"""
        cursor.execute(sql, (res_name, res_id)) 
        conn.commit()
    return True

当执行此查询并且我输入不存在的 id 时,来自 DB 的答案是“查询正常”。 请帮我解决问题!

【问题讨论】:

  • 捕获不存在问题的目的是什么?,因为SQL定义明智,更新的返回是可以的。 (因此需要另一种问题方法来帮助您找到解决方案)

标签: python mysql


【解决方案1】:

像这样修改你的代码:

def edit_resource(res_name, res_id):
    res = False
    with db_pool().manager() as conn:
        cursor = conn.cursor()
        sql = """UPDATE `resource` SET `resource_name` = %s WHERE id = %s;"""
        if cursor.execute(sql, (res_name, res_id)) > 0:
          res = True
        conn.commit()
    return res

思路是检查 cursor.execute() 的返回值,返回受影响的行数。

【讨论】:

    【解决方案2】:

    将此附加到您的 SQL 查询中:

    SELECT ROW_COUNT();
    

    然后将整个查询视为 SELECT,其中返回的单个列是“受影响的行数”。在这种情况下,更新的行数。

    详情请看:How to get number of rows affected, while executing MySQL query from bash?

    【讨论】:

    • ROW_COUNT 可以为 0,如果该值等于已经存在的值(因此如果 $id==%s)没有执行真正的更新,结果 ROW_COUNT=0
    • @Norbert 真的吗?!这似乎很奇怪,也无济于事。我希望 ROW_COUNT 只对应于我的 WHERE 子句过滤的结果,并且一点也不关心我要更新的值。这听起来很糟糕,你确定是这样吗?
    • 100% 确定(测试确定)。这是一种性能优化(节省昂贵的写入 IO)。然而,有一个 CLIENT_FOUND_ROWS(参见 stackoverflow.com/questions/19062530/… )可以解决问题。
    • @Norbert,感兴趣并开始检查.. 你是对的! ...但是有一个标志可以覆盖它(必须在打开连接时设置:dev.mysql.com/doc/refman/5.5/en//…。阅读完整的复杂行为让我感到难过。:)
    • 覆盖标志:有趣。我个人会选择不同的数据设计(如果可能的话):INSERT INTO blabla ON DUPLICATE KEY UPDATE blabla。无需检查。
    猜你喜欢
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多