Устранение нарушения уникальности первичного ключа в источниках данных, производных от SQLite (SpatiaLite, GeoPackage).

Идеи и запросы на отсутствующую или изменение существующей функциональности QGIS, патчи.
Ответить
drrrrr
Участник
Сообщения: 85
Зарегистрирован: 31 янв 2012, 10:51
Репутация: 50

Устранение нарушения уникальности первичного ключа в источниках данных, производных от SQLite (SpatiaLite, GeoPackage).

Сообщение drrrrr » 23 июн 2020, 12:14

Ошибка проявляется в Qgis версии 2.xx при сохранении слоя SQLite (SpatiaLite, GeoPackage) после добавления новых объектов с неуникальным id, или разбиения/разделения составных геометрий или разделения простых геометрий существующих объектов. Предлагаемый сценарий для версии 2.xx предотвращает возникновение этой ошибки.

Код: Выделить всё

#this startup script for qgis 2.xx prevents violation of the 
#unique ID constraint when committing a SQLite-based data source
#dr_gis at mail.ru
from qgis.core import QgsMapLayerRegistry
from qgis.utils import iface

def filterSQLiteBasedSource(l):
    if l and l.type()==0 and l.dataProvider().storageType() in ('GPKG', 'SQLite', 'SpatiaLite'):
        l.beforeCommitChanges.connect(dropId)

def dropId():
    for f in iface.activeLayer().editBuffer().addedFeatures():
        iface.activeLayer().changeAttributeValue(f,0,None,None)

QgsMapLayerRegistry.instance().layerWasAdded.connect(filterSQLiteBasedSource)
Код нужно поместить в файл startup.py (создать новый или добавить к существующему) в папке python в папке профиля пользователя и в последующих сессиях qgis ошибка не возникнет.
Увы, решение уже не столь актуально, как 2-3 года назад, но лучше поздно, чем никогда, пока qgis2 все еще остается в деле.

Ответить

Вернуться в «Предложения по QGIS»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 7 гостей