我们的用例: 我们的REST端点从多个主机收集信息。对于每个主机,MySQL表中都有一行。当主机发送新数据时,我们使用最新更新时间戳和主机行更新元数据平板电脑,然后提交。
这完全由SQLAlchemy.Session.merge()
完成。此脚本一直运行良好,但我们发现当数据库远离REST端点时,响应时间会大大增加。
通过一些调查,我们发现,对于每个主机信息更新,merge(object)
调用将连接数据库,然后同时位于commit()
。
我尝试使用add(object)
,但由于主键冲突(主机名是主键)而失败。
我尝试使用merge(object, load=False)
,但这似乎也不起作用。
我想要的是:使用合并调用更新对象的本地版本,然后在提交时更新数据库,更新现有主键,并在主键不存在时插入。这有可能吗?
一些例子:
db.session.merge(object1)
db.session.merge(object2)
db.session.commit()
访问数据库3次。
db.session.add(object1)
db.session.add(object2)
db.session.commit()
失败,因为数据库中已有object1
和object2
(IntegrityError
)
db.session.merge(object1, load=False)
db.session.merge(object2, load=False)
db.session.commit()
也失败了,因为刚刚创建了object1和object2,这不是会话所期望的(它们必须在会话中)。
我想拥有什么:
db.session.upsert(object1)
db.session.upsert(object2)
db.session.commit()
仅在提交时访问数据库,一次。 upsert
当然不存在,我刚刚发明了这个名字。