Я использую LayerMapping для добавления шейп-файла в базу данных. Вот код, который я использую. Размер шейп-файла составляет ~ 100 МБ, поэтому нужно добавить кучу полигонов.
mapping = {'name': 'OBJECTID', 'poly': 'POLYGON'}
lm = LayerMapping(TestGeo, 'toronto geo/PROPERTY_BOUNDARIES_WGS84.shp', mapping)
lm.save(verbose=True)
После запуска приведенного выше кода я бы увидел около 10 секунд сообщений об успехе, показывающих что-то вроде Saved: 'name': 12345
. Затем через 10 секунд сообщения превращаются в:
Failure to save: {'name': 12345, 'poly': (....)}: An error occurred in the current transaction. You can't execute queries until the end of the 'atomic' block.
Он все еще продолжает работать после отображения сообщения об ошибке (я предполагаю, что он переместился на следующий полигональный объект). После прохождения каждого многоугольника, несмотря на то, что первые несколько сотен многоугольников показали сообщение об успешном завершении, ни один из многоугольников из шейп-файла не был сохранен.
Я наткнулся на аналогичная ошибка, но содержание, похоже, не связано.
Есть идеи, почему это происходит?
У меня тоже была похожая проблема. Оказалось, что моя модель была неправильно сконфигурирована, и ошибка возникла в первой итерации функции сохранения. Я предполагаю, что какая-то блокировка базы данных остается включенной, и последующие вызовы дают вам проблему с атомарным блоком? Попробуйте запустить lm.save(verbose=True, strict=True)
, чтобы поймать любой IntegrityError
.
Похоже, что в исходном слое есть MultiPolygon.
измените геометрию вашего режима на модели. MultiPolygonField решит вашу проблему.