使用sqlalchemy进行高效更新,插入失败

时间:2013-07-09 00:22:57

标签: python python-2.7 sqlalchemy

我基本上需要做一个INSERT ... ON DUPLICATE KEY UPDATE但是该行已经存在99.9%的时间。因此,我真正想做的是UPDATE,抓住奇怪的异常和INSERT

在sqlalchemy中,我通常会执行以下操作:

new_obj = MyModel(the_pk=id)
new_obj = MyModel.__table__.c.some_val + val
session.merge(new_obj)

我注意到,当我打电话给session.merge时,sqlalchemy执行SELECT,这在我知道我几乎总是UPDATE的情况下是低效的。是否有一些方法可以改善仅仅编写原始SQL(我很好)?我只是想知道是否有一些我缺少的sqlalchemy技巧。

此外,在进行合并之后,如果在刷新/提交会话之前存在具有冲突PK的行,会发生什么?我假设选择是确定sqlalchemy是否需要稍后执行INSERTUPDATE

1 个答案:

答案 0 :(得分:1)

情侣选择: 1)绕过SA并执行实际的合并语句,或者如果dbms支持,则使用replace语句。这是一个用于添加合并声明的SA票证,其中还包含替换声明的收据:SA Ticket 960

2)简单的方法,做一个更新,你会得到更新的行数,如果它是0做插入。

如果您有多个编写器,则第二个选项可能会出现问题,因为两个编写器可能会更新,并且两个编写器都会更新,然后只有两个编写器插入中的一个会成功。不确定这是否是您案件中的问题,但需要注意的事项。