从XML导入数据时,将可识别的唯一ID分配给行

时间:2019-04-12 11:12:26

标签: python django postgresql

我正在设计一个数据库,每天将在其中从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)

    • 虽然我在此处(IMO)没发现任何问题,但是UUID可能会受到影响,我更希望在JOINs中使用数字pk
  • 尝试3

    URLs用作source_id:xml_item_id

    • 尝试2
    • 一样担心

我在所有尝试中均避免使用pk (string)的原因是,将来很有可能将这些数据分片,并且我希望这对AI PKs的影响相对较低发生这种情况时正在生成

处理此问题的最佳方法是什么?

  • 确定数据库中是否已存在项目
  • 具有易于使用的网址pk
  • 尽量不要过分影响JOIN性能

1 个答案:

答案 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()