在使用SQL进行批量创建之后,会创建重复的行

2024-03-28 20:30:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一个批量创建,一次将大量信息转储到数据库中。信息是分层的-我创建顶层,然后将数据用作下一层的关系,等等。我不能使用PostgreSQL,所以在执行批量创建时,我不能利用它返回主键的能力。你知道吗

相反,我创建一个UUID,并将其粘贴到每一层中,然后使用它来获取我刚刚创建的行,以便在下一层中使用它们。简化模型如下所示:

class Container(Component):
    parent = models.ForeignKey('self', related_name='children', null=True, blank=True, on_delete=models.CASCADE)
    bulk_insert_id = models.UUIDField(default=uuid.uuid4)

我刚刚创建的内容的批量创建/查询如下所示:

bulk_insert_id = uuid.uuid4()
requirements = []
for requirement, child in zip(self.component['children'], self.children):
    r = models.Container(
        parent=self.db,
        bulk_insert_id=bulk_insert_id,
    )
    child.db_id = r
    requirements.append(r)
models.Container.objects.bulk_create(requirements)
requirements = models.Container.objects.filter(bulk_insert_id=bulk_insert_id)

我遇到的问题是,当我实际使用这些元素时,我会发现它们的副本。就好像一个拷贝是由bulk create插入的,然后在我第一次访问/保存数据时创建另一个拷贝。以下是SSMS的示例屏幕截图:

SSMS view of duplicate rows

如上图所示,最后两行是前两行的副本。你知道这些复制品是从哪里来的吗?你知道吗

工具:

  • SQL服务器
  • 德扬戈1.11
  • django pyodbc azure 1.11.0.0版

Tags: 数据self信息idtrueuuidmodelscontainer
2条回答

这个问题对我来说不是很清楚,但由于我还不能发表评论,这里有一个答案:

我将假设您的数据在一个数组中(比如String [] dataset),并希望将其转换为二维数组,因此以下是步骤

首先使用AxB大小初始化二维数组:

int a = dataset.length/5; // the size of your dataset divided by the chuncks
int b = 5; // the size of your chunck
String[][] processedDataset = new String[a][b];

然后,您需要用数据集填充二维数组。这可以通过一个基本的for循环来实现:

int k = 0;
for(int i = 0; i < processedDataset.length; i++){
  for(int j = 0; j < processedDataset[i].length; j++){
    processedDataset[i][j] = dataset[k++];
  }
}

可以使用guava库进行分区 Guava list partition

List<String> element= //...
List<List<String>> smallerLists = Lists.partition(element, # of partition you want);

相关问题 更多 >