GeoDjango - LayerMapping: в текущей транзакции произошла ошибка. Вы не можете выполнять запросы до конца атомарного блока - PullRequest
0 голосов
/ 02 мая 2018

Я использую 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.

Он продолжает работать после отображения сообщения об ошибке (полагаю, он переместился на следующий объект многоугольника). После прохождения каждого полигона, несмотря на тот факт, что первые пара сотен или около того полигонов показали сообщение об успехе, ни один из полигонов из шейп-файла не был сохранен.

Я столкнулся с аналогичной ошибкой , но содержание, похоже, не связано.

Есть идеи, почему это происходит?

1 Ответ

0 голосов
/ 13 января 2019

У меня тоже была похожая проблема. Оказывается, что моя модель была неправильно настроена, и ошибка возникла в первой итерации функции сохранения. Я предполагаю, что какая-то блокировка базы данных остается, и последующие вызовы вызывают проблему атомного блока? Попробуйте запустить lm.save(verbose=True, strict=True), чтобы поймать любого IntegrityError.

...