Python MySQLdb:如果存在则更新,否则插入

时间:2009-11-26 07:55:30

标签: python sql sql-update sql-insert

我正在寻找一种简单的方法来查询更新或插入,基于该行是否存在于第一位。我现在正在尝试使用Python的MySQLdb。 这就是我执行查询的方式:

self.cursor.execute("""UPDATE `inventory`
                          SET `quantity` = `quantity`+{1}
                        WHERE `item_number` = {0}
                    """.format(item_number,quantity));

我已经看到了四种方法来实现这一目标:

  1. DUPLICATE KEY。不幸的是,主键已被用作唯一ID,因此我无法使用它。

  2. 替换。与上述相同,我认为它依赖于主键才能正常工作。

  3. mysql_affected_rows()。通常,您可以在更新行后使用此选项以查看是否有任何影响。我不相信Python中的MySQLdb支持这个功能。

  4. 当然最后的努力:根据结果进行SELECT查询,取消,然后更新或插入。基本上我只是试图将查询保持在最低限度,因此2个查询而不是1个现在不太理想。

  5. 基本上我想知道在选择4之前我是否错过任何其他方法来完成这项工作。感谢您的时间。

1 个答案:

答案 0 :(得分:2)

Mysql DOES允许您拥有唯一索引,INSERT ... ON DUPLICATE UPDATE将执行更新,如果任何唯一索引有重复,而不仅仅是PK。

但是,我可能仍然会采用“两种查询”的方法。你是在交易中这样做的,对吗?

  1. 进行更新
  2. 检查受影响的行,如果为0则执行插入
  3. OR

    1. 尝试插入
    2. 如果由于唯一索引违规而失败,请执行更新(注意:您需要检查错误代码以确保它没有因某些原因而失败)
    3. 如果行通常已经存在,前者是好的,但是如果你在事务之外执行它或者你的隔离模式不够高,可能会导致竞争(或死锁)条件。

      在库存表中创建item_number的唯一索引听起来对我来说是一个好主意,因为我想(不知道您的架构的细节)一个项目应该只有一个库存级别(假设您的系统没有允许多个库存地点等。)