def upsert_on_index_elements(self, instance):
"""
Upsert an event by index elements.
Uses ON CONFLICT ... DO NOTHING to handle uniqueness constraint violations without
invalidating the current transactions completely.
Depends on an unique constraint on index elements to find the resulting entry.
"""
with self.flushing():
insert_statement = insert(self.model_class).values(
instance._members(),
)
upsert_statement = insert_statement.on_conflict_do_nothing(
index_elements=self.upsert_index_elements(),
)
self.session.execute(upsert_statement)
most_recent = self._retrieve_most_recent(
*[
getattr(self.model_class, elem) == getattr(instance, elem)
for elem in self.upsert_index_elements()
]
)
if not most_recent.is_similar_to(instance):
raise ConcurrentStateConflictError()
return most_recent
评论列表
文章目录