Дублированные строки создаются после массового создания с SQL Server - PullRequest
0 голосов
/ 02 мая 2018

Я делаю массовое создание, чтобы выгрузить много информации в базу данных одновременно. Информация является многоуровневой - я создаю верхний слой, затем использую данные в качестве отношений для следующего слоя и т. Д. Я не могу использовать 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)

Проблема, с которой я сталкиваюсь, заключается в том, что когда я на самом деле использую эти элементы, я нахожу их дубликаты. Это как если бы копия была вставлена ​​массовым созданием, а затем я создаю другую копию, когда я впервые получаю к ней доступ / сохраняю данные. Вот пример скриншота из SSMS:

SSMS view of duplicate rows

Как видно из изображения выше, последние две строки являются копиями первых двух строк. Есть идеи, откуда эти дубликаты?

Инструменты:

  • SQL Server
  • Джанго 1,11
  • django-pyodbc-azure 1.11.0.0

1 Ответ

0 голосов
/ 02 мая 2018

Я понял, что я делаю неправильно - я сохранил устаревшую ссылку на контейнер перед массовым созданием его.

Массовое его создание помещает одну копию строки в базу данных. Затем, когда я использовал устаревшую ссылку (и сохранил), вставил вторую копию строки - без дочерних элементов, указывающих на нее.

Решением было перемещение устаревшей ссылки до массового создания, например:

bulk_insert_id = uuid.uuid4()
requirements = []
for requirement in self.children:
    r = models.Container(
        parent=self.db,
        bulk_insert_id=bulk_insert_id,
    )
    requirements.append(r)
    # don't use the link here, it will be stale when we make the requirements
models.Container.objects.bulk_create(requirements)
requirements = models.Container.objects.filter(bulk_insert_id=bulk_insert_id)
# new stuff
for requirement, child in zip(requirements, self.children):
    child.db_id = requirement
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...