Yuego / django-fias

Other
112 stars 70 forks source link

Дубли записей в таблице ROOM #61

Open Sky-Cat opened 7 years ago

Sky-Cat commented 7 years ago

При импорте данных из таблицы room программа вылетает с ошибкой

django.db.utils.IntegrityError: (1062, "Duplicate entry '47aab24a73084c6c8756787b7172076a' for key 'fias_room_roomguid_f8e479d0_uniq'")

Подскажите, пожалуйста, можно ли как-то пропускать дубли и продолжать импорт данных?

Запускаю полный импорт так:

python manage.py fias --src auto --format xml

Полный лог ошибок:

T: room. L: 68453 | U: 0 | S: 486925[E:472683] | R: 0[0]        FN: AS_ROOM_20160922_67c6a747-b702-4759-9542-d78b90c9b4f4.XML
Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 353, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 345, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 348, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 399, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python2.7/dist-packages/fias/management/commands/fias.py", line 117, in handle
    limit=limit, tables=tables, keep_indexes=keep_indexes
  File "/usr/local/lib/python2.7/dist-packages/fias/importer/commands.py", line 89, in load_complete_data
    restore_indexes_for_model(model=first_table.model)
  File "/usr/local/lib/python2.7/dist-packages/fias/importer/indexes.py", line 64, in restore_indexes_for_model
    change_indexes_for_model(model=model, field_from=simple_field, field_to=field)
  File "/usr/local/lib/python2.7/dist-packages/fias/importer/indexes.py", line 54, in change_indexes_for_model
    ed.alter_field(model, field_from, field_to)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/base/schema.py", line 482, in alter_field
    old_db_params, new_db_params, strict)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/base/schema.py", line 663, in _alter_field
    self.execute(self._create_unique_sql(model, [new_field.column]))
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/base/schema.py", line 110, in execute
    cursor.execute(sql, params)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "/usr/local/lib/python2.7/dist-packages/django/db/utils.py", line 95, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/mysql/base.py", line 112, in execute
    return self.cursor.execute(query, args)
  File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 226, in execute
    self.errorhandler(self, exc, value)
  File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
    raise errorvalue
django.db.utils.IntegrityError: (1062, "Duplicate entry '47aab24a73084c6c8756787b7172076a' for key 'fias_room_roomguid_f8e479d0_uniq'")
Yuego commented 7 years ago

Пропуск ошибочных записей запускается автоматически в процессе импорта.

А тут из-за отсутствующего ограничения уникальности ошибка не была перехвачена вовремя.

Дубликат обнаружился при восстановлении удалённых индексов. А обработать эту ситуацию гораздо сложнее (хотя, на этот счет у меня есть мысли, но это будет больше походить на костыли...).

Думаю, надо чуть поправить функцию удаления индексов, чтоб ограничения не удалялись.

PS Вы можете попробовать импортировать таблицу, отключив удаление индексов (--keep-indexes), но сейчас их уже нет и восстановить их штатно у вас не выйдет. Для этого тоже нужно разработать решение...

Sky-Cat commented 7 years ago

Спасибо за ответ. Правильно ли я понимаю, что коммит https://github.com/Yuego/django-fias/commit/83f3c0b73f5c633e997cb393af95db445161da56 решает проблему и без использования параметра --keep-indexes?

Кстати, при наличии фильтра скорость что с индексами что без них примерно одинакова - около полутора суток.

Yuego commented 7 years ago

Правильно ли я понимаю, что коммит 83f3c0b решает проблему и без использования параметра --keep-indexes?

Да, эту конкретную проблему должно решить.

Кстати, при наличии фильтра скорость что с индексами что без них примерно одинакова - около полутора суток.

Это уже зависит от железа. На моём тест показал огромную разницу в скорости. Особенно это заметно на таблице house. Чем больше размер уже импортированных данных - тем медленнее идет импорт с индексами.

Sky-Cat commented 7 years ago

К сожалению, в последней версии (1.1.8) перестали вообще применяться фильтры.

Пример фильтра:

    if item.regioncode == '76':
        return item

Программа просто перебирает все значения в таблицах, но ни одна запись не вносится в базу.

Yuego commented 7 years ago

Это очень странно, т. к. этот функционал не менялся последнее время. У меня пока нет возможности проверить, в чем дело.

Такое поведение наблюдается при импорте из DBF? Или с XML тоже?

Sky-Cat commented 7 years ago

Да, что XML, что DBF. Просто все мимо пролетает. База была с нуля создана, заполнена таблицами и затем была попытка сделать полный импорт.

Yuego commented 7 years ago

Как временное решение, можно воспользоваться приведением типов:

if str(item.regioncode) == '76':
    return item

Там наверняка проблема именно в несовпадении типов.

Sky-Cat commented 7 years ago

Попробовал все варианты:

Теперь вносятся ВСЕ данные в базу.

Дополнения и уточнения:

  1. DBF - при любых параметрах и настройках вносятся все записи в таблицы
  2. XML - при любых параметрах и настройках записи не вносятся вообще.