как получить sequence.nextval из postgis из pyqgis

Вопросы по свободной ГИС QGIS. Сообщения об ошибках, предложения по улучшению, локализация.
Ответить
Аватара пользователя
Филиппов Владислав
Гуру
Сообщения: 1035
Зарегистрирован: 17 фев 2006, 06:28
Репутация: 144
Ваше звание: Геннадич
Откуда: Новосибирск
Контактная информация:

как получить sequence.nextval из postgis из pyqgis

Сообщение Филиппов Владислав » 13 окт 2014, 13:37

Здравствуйте.
как можно получить sequence.nextval из базы данных postgis из кода pyqgis (консоль QGIS)?
у меня есть слой из БД и шейп-файл. я хочу добавить объекты из шейпа в слой из БД, всё работает, но проблема в том как добавить значения в поле ID слоя из базы, которое PRIMARY KEY и берётся из известного сиквенса.
Снимок.PNG
Снимок.PNG (59.27 КБ) 4624 просмотра

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: как получить sequence.nextval из postgis из pyqgis

Сообщение Denis Rykov » 13 окт 2014, 15:19

А разве поле ID не заполнится автоматом, если не указывать значение явно?

[ Сообщение с мобильного устройства ]
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
Филиппов Владислав
Гуру
Сообщения: 1035
Зарегистрирован: 17 фев 2006, 06:28
Репутация: 144
Ваше звание: Геннадич
Откуда: Новосибирск
Контактная информация:

Re: как получить sequence.nextval из postgis из pyqgis

Сообщение Филиппов Владислав » 13 окт 2014, 16:51

а как? :oops:
я пока не силён в Python

Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: как получить sequence.nextval из postgis из pyqgis

Сообщение Дмитрий Барышников » 13 окт 2014, 17:46

Удалите из кода присваивание полю id значения. Должно помочь.

[ Сообщение с мобильного устройства ]

Аватара пользователя
Филиппов Владислав
Гуру
Сообщения: 1035
Зарегистрирован: 17 фев 2006, 06:28
Репутация: 144
Ваше звание: Геннадич
Откуда: Новосибирск
Контактная информация:

Re: как получить sequence.nextval из postgis из pyqgis

Сообщение Филиппов Владислав » 14 окт 2014, 06:15

атрибуты это список и используется так - createFeature.setAttributes(cfeature_Attributes)

так в БД:
[batr0(тот самый автоинкрементный ID), batr1, batr2, batr3]

а так в шейпе:
[satr0, satr1, satr2]

и нужно чтобы было:
batr0 = ??? (None Или "" это значения и в БД появляются соответственно NULL или пустая строка)
batr1 = satr0
batr2 = satr1
batr3 = satr2
т.е. сдвиг на единицу.

внешне атрибуты выглядят так
Снимок.PNG
Снимок.PNG (58.52 КБ) 4530 просмотров
собственно один из вариантов моего кода:

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

        createFeature = QgsFeature()
        createFeature.setGeometry(NewObj.geometry())
        cfeature_Attributes=[]
        cfeature_Attributes.append("") #в append обязательно нужно передавать аргумент
        for index, atr in enumerate(NewObj.attributes()):
            cfeature_Attributes.append(atr)
        
        #del cfeature_Attributes[0]
        for a in cfeature_Attributes:
            print a
        createFeature.setAttributes(cfeature_Attributes)

Аватара пользователя
Филиппов Владислав
Гуру
Сообщения: 1035
Зарегистрирован: 17 фев 2006, 06:28
Репутация: 144
Ваше звание: Геннадич
Откуда: Новосибирск
Контактная информация:

Re: как получить sequence.nextval из postgis из pyqgis

Сообщение Филиппов Владислав » 14 окт 2014, 10:24

всем спасибо за участие. я победил.

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

newdata = iface.mapCanvas().layer(0)
existdata = iface.mapCanvas().layer(1)

objs = newdata.getFeatures()
idxNew = newdata.fieldNameIndex('Cadnumber')
idxEx = existdata.fieldNameIndex('Cadnumber')
fields = existdata.pendingFields()

    for NewObj in objs:
        if (existdata.isEditable() == False):
            break
        isfind = False
        new_data_count += 1
        features = existdata.getFeatures(QgsFeatureRequest().setFilterExpression ( u"Cadnumber= '" + NewObj.attributes()[idxNew] + "'") )
        for f in features:
            isfind = True
        createFeature = QgsFeature()
        createFeature.setFields(fields, True)
        createFeature.setGeometry(NewObj.geometry())

        for index, atr in enumerate(NewObj.attributes()):
            createFeature.setAttribute(index+1, atr)
====================================================

Ответить

Вернуться в «QGIS»

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

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