Страница 1 из 1

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

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

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

Добавлено: 13 окт 2014, 15:19
Denis Rykov
А разве поле ID не заполнится автоматом, если не указывать значение явно?

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

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

Добавлено: 13 окт 2014, 16:51
Филиппов Владислав
а как? :oops:
я пока не силён в Python

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

Добавлено: 13 окт 2014, 17:46
Дмитрий Барышников
Удалите из кода присваивание полю id значения. Должно помочь.

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

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 КБ) 4535 просмотров
собственно один из вариантов моего кода:

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

        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)

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)
====================================================