我正在尝试使用API收集的数据更新数据库,并且需要确保所有表都已更新。
有时候,我会收到数据库中已经存在的数据,所以我想执行INSERT IGNORE。
我当前的代码如下:
def update_orders(new_orders):
entries = []
for each_order in new_orders:
shipping_id = each_order['id']
title = each_order['title']
price = each_order['price']
code = each_order['code']
source = each_order['source']
phone = each_order['phone']
category = each_order['delivery_category']
carrier = each_order['carrier_identifier']
new_entry = Orders(
id=shipping_id,
title=title,
code=code,
source=source,
phone=phone,
category=category,
carrier=carrier,
price=price
)
entries.append(new_entry)
if len(entries) == 0:
print('No new orders.')
break
else:
print('New orders:', len(entries))
db.session.add_all(entries)
db.session.commit()
当我从头开始创建数据库时,这很好用,但是如果有重复的数据,并且我无法提交插入,它将给我一个错误。
我已经阅读了一段时间,找到了一种使用prefix_with
的解决方法:
print('New orders:', len(entries))
if len(entries) == 0:
print('No new orders.')
else:
insert_command = Orders.__table__.insert().prefix_with('OR IGNORE').values(entries)
db.session.execute(insert_command)
db.session.commit()
问题在于values(entries)
是一堆对象:
<shop.database.models.Orders object at 0x11986def0>
是内存中的类实例对象,而不是类的实例。
有人对解决这个问题有什么建议吗? 可以随意提出其他方法,或者只是一种调整。
非常感谢。
答案 0 :(得分:0)
您正在使用哪个数据库?在MySQL下,“ INSERT OR IGNORE”不是有效的语法,而是应该使用“ INSERT IGNORE”。我遇到了同样的情况,并使查询与以下对象一起工作:
insert_command = Orders.__table__.insert().prefix_with(' IGNORE').values(entries)