Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
Sky-Cat opened this issue Sep 26, 2016 · 8 comments
Open

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

Sky-Cat opened this issue Sep 26, 2016 · 8 comments
Labels

Comments

@Sky-Cat
Copy link

Sky-Cat commented Sep 26, 2016

При импорте данных из таблицы 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
Copy link
Owner

Yuego commented Sep 26, 2016

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

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

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

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

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

@Sky-Cat
Copy link
Author

Sky-Cat commented Sep 27, 2016

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

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

@Yuego
Copy link
Owner

Yuego commented Sep 27, 2016

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

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

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

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

@Sky-Cat
Copy link
Author

Sky-Cat commented Oct 7, 2016

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

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

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

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

@Yuego
Copy link
Owner

Yuego commented Oct 11, 2016

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

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

@Sky-Cat
Copy link
Author

Sky-Cat commented Oct 11, 2016

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

@Yuego
Copy link
Owner

Yuego commented Oct 11, 2016

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

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

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

@Sky-Cat
Copy link
Author

Sky-Cat commented Oct 13, 2016

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

  • Приведение типов
  • Отмена коммита 83f3c0b
  • Параметр --keep-indexes

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

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants