我正在设计一个数据库,我将每天从XML导入大量数据以创建或更新现有行。项目数据涵盖了几十个表,这些表都与item_id
主表中的item
相关
对于XML文件中的每个项目,我需要检查它是否已存在于数据库中并更新或创建(如果它不存在)。
每个XML都属于source_id
,XML中的每个项目都包含一个最多50个字符的唯一字母数字ID(但这些ID在所有XML中并不是唯一的),所以source_id:xml_item_id
在这里是唯一的
我需要的是一种查找项目是否已存在于数据库中的方法。理想情况下,我将通过pk搜索并使用相同的pk来加入其他表
source_id:xml_item_id
编码为bigint
用于pk
以及将bigint
解码回原来的source_id:xml_item_id
,但大多数时候这是溢出的
所以这不会起作用UUID
作为pk
和source_id:xml_item_id
作为unique_id (string)
供搜索,但将相关表格加入UUID
虽然我没有看到任何错误(IMO),JOINs
可能会受到影响,我更喜欢数字pk
用于URLs
source_id:xml_item_id
作为pk (string)
与尝试2相同的担忧我在所有尝试中避免使用AI PKs
的原因是,将来很有可能对这些数据进行分片,并且我希望这对PKs
在生成这种情况时的生成方式的影响相对较小。
处理这个问题的最佳方法是什么?
您可以一起使用
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()