0

我基本上需要做一个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.mergesqlalchemy 时会执行 a SELECT,在我知道我几乎总是在UPDATE'ing 的情况下,这是低效的。除了编写原始 SQL(我很满意)之外,有什么方法可以改进这个问题吗?我只是想知道我是否缺少一些 sqlalchemy 技巧。

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

4

1 回答 1

1

几个选项: 1)绕过 SA 并执行实际的合并语句或使用替换语句(如果您的 dbms 支持)。这是添加合并语句的 SA 票证,其中还包括替换语句的收据: SA Ticket 960

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

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

于 2013-07-09T01:48:03.363 回答