我正在设计一个数据库,每天将在其中从XML导入大量数据以创建或更新现有行。
项目数据跨越数十个表,所有这些表都与主item_id
表中的item
相关
对于XML文件中的每个项目,我需要检查它是否已经存在于数据库中,并更新或创建它是否不存在。
每个XML都属于一个source_id
,并且XML中的每个项目都包含一个唯一的字母数字ID,最多50个字符(但是这些ID在所有XML中都不唯一),因此source_id:xml_item_id
在这里将是唯一的
我需要的是一种查找项目是否已存在于数据库中的方法。理想情况下,我将按pk搜索并使用相同的pk来联接其他表
尝试1
我曾尝试将source_id:xml_item_id
的{{1}}编码为bigint
,并将pk
解码回原始的bigint
,但是大多数到处都是
尝试2
将source_id:xml_item_id
用作UUID
,将pk
用作source_id:xml_item_id
,以便进行搜索,但是将相关表连接到unique_id (string)
UUID
可能会受到影响,我更希望在JOINs
中使用数字pk
尝试3
将URLs
用作source_id:xml_item_id
我在所有尝试中均避免使用pk (string)
的原因是,将来很有可能将这些数据分片,并且我希望这对AI PKs
的影响相对较低发生这种情况时正在生成
处理此问题的最佳方法是什么?
答案 0 :(得分:0)
您可以一起使用唯一性
class Data(models.Model):
source_id = models.CharField()
xml_item_id = models.CharField()
# ... other fields
class Meta:
unique_together = ("source_id", "xml_item_id")
然后在您的导入功能中:
scid = your_xml_source_id
xmlid = your_xml_id
obj, created = Data.objects.get_or_create(source_id=scid, xml_item_id=xmlid)
if created:
# it's the new object, populate obj with the rest of the data
obj.other_field = your_xml_other_field
else:
# it's existing object, update object with a new value
obj.other_field = new_value
obj.save()