我基本上需要做一个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是否需要稍后执行INSERT
或UPDATE
答案 0 :(得分:1)
情侣选择: 1)绕过SA并执行实际的合并语句,或者如果dbms支持,则使用replace语句。这是一个用于添加合并声明的SA票证,其中还包含替换声明的收据:SA Ticket 960
2)简单的方法,做一个更新,你会得到更新的行数,如果它是0做插入。
如果您有多个编写器,则第二个选项可能会出现问题,因为两个编写器可能会更新,并且两个编写器都会更新,然后只有两个编写器插入中的一个会成功。不确定这是否是您案件中的问题,但需要注意的事项。