我有一个函数,检查表中是否有重复的行,并覆盖前面的行。
它已经为我工作在过去,当移动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)
和正确提交的更改。