如何合并/覆盖相同的行而不出错sqlalchemy



我有一个函数,检查表中是否有重复的行,并覆盖前面的行。

它已经为我工作在过去,当移动id到另一行,但现在这个错误发生:

raise orm_exc.FlushError(
sqlalchemy.orm.exc.FlushError: New instance <Usage at 0x7fb3f2a035e0> 
with identity key (<class 'blueprints.site.usage.Usage'>, (859,), None) 
conflicts with persistent instance <Usage at 0x7fb3d896ee50>

当我给更新的行分配一个新的id时,没有错误。如何将旧id重新分配给新行?

def save_as_single_row(self):
"""
Save usage as a single row in usage table.
"""
query = Usage.query.filter_by(site_id=self.site_id, invoice_num=self.invoice_num, 
supply_charge=self.supply_charge)
this_usage = query.all()
if not this_usage or (len(this_usage) == 1 and this_usage[0] == self):
print(self.start_date, 'self')
self.save()
print(self.start_date)
return self
print('Usage already exists', this_usage[-1].__dict__)
self.id = this_usage[-1].id
self.credit = this_usage[-1].credit
self.awaiting_bill_combine = this_usage[-1].awaiting_bill_combine
self.awaiting_site_combine = this_usage[-1].awaiting_site_combine
query.delete()
db.session.add(self)
db.session.commit()
return self

看起来答案比我想象的要简单得多,我删除了db.session.add(self)并添加了:

new_obj = db.session.merge(this_usage[-1])
db.session.commit()

这似乎将最近一行的值与原始行的id合并了。

如果有人想知道,这里有更多的信息。

编辑:

session.merge()停止很好地播放多行,所以我停止使用db.session.add(self)和正确提交的更改。

最新更新