SQLAlchemy Session.merge()无需访问数据库

时间:2015-11-05 09:12:55

标签: python mysql sqlalchemy

我们的用例: 我们的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()

失败,因为数据库中已有object1object2IntegrityError

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当然不存在,我刚刚发明了这个名字。

0 个答案:

没有答案