作者:暖心我在这_若惜 | 来源:互联网 | 2023-07-19 16:34
我正在尝试通过创建新实例,设置id并合并来对数据库行进行更新。
inbound_shipment = self.factory.build_from_mws(
account.id,amazon_account.id,inbound_shipment_data,inbound_shipment_items_data,)
if existing:
inbound_shipment.id = existing.id
for item in inbound_shipment.inbound_shipment_items:
# setting the inbound shipment id just in case
item.inbound_shipment_id = inbound_shipment.id
session = FBAInboundShipment.get_session()
merged = session.merge(inbound_shipment)
session.commit()
工厂会创建一个模型(及其子实例)实例,但不保存它,也不会分配ID。您可以看到FBAInboundShipmentItem.account_id
在构造时被设置了:
def build(self,account_id,amazon_account_id,inbound_shipment_items_data):
inbound_shipment_items = []
for item_data in inbound_shipment_items_data:
prep_details_data = item_data.pop("prep_details_list",[])
prep_details = [FBAPrepDetails(**pd) for pd in prep_details_data]
inbound_shipment_items.append(
FBAInboundShipmentItem(account_id=account_id,prep_details_list=prep_details,**item_data)
)
inbound_shipment = FBAInboundShipment(
account_id=account_id,amazon_account_id=amazon_account_id,inbound_shipment_items=inbound_shipment_items,**inbound_shipment_data
)
return inbound_shipment
合并很好,但是当我提交时,我得到了一个带有account_id的查询,这当然会失败,因为它具有FK约束。
这是该过程的一部分调试。
这是在合并之前(货物中的最后一个项目),来自上面设置货物ID的循环中。您可以看到account_id
具有一个值:
ipdb> p item
这是合并之后的内容,此处account_id
still 具有一个值。
ipdb> p merged.inbound_shipment_items[0]
但是当调用.commit()
时:
IntegrityError: (_mysql_exceptions.IntegrityError) (1452,'Cannot add or update a child row: a foreign key constraint fails (`mydb`.`rst_fba_inbound_shipment_items`,CONSTRAINT `rst_fba_inbound_shipment_items_ibfk_2` FOREIGN KEY (`account_id`) REFERENCES `accounts` (`id`) ON DELETE CASCADE)')
[SQL: UPDATE rst_fba_inbound_shipment_items SET account_id=%s,inbound_shipment_id=%s WHERE rst_fba_inbound_shipment_items.id = %s]
[parameters: ((None,None,1256L),(None,1257L),1258L),1259L),1260L),1261L),1262L),1263L) ... displaying 10 of 28 total bound parameter sets ... (None,1282L),1283L))]