Сервер QGIS отправляет UPDATE… WHERE NULL на postgis в слое WFS

9

Я использую сервер Windows Server 2012.

PostgreSQL 9.3.5, 64-битная версия

ПОСТГИС 2.1.3

QGIS Server 2.6.1-2

QGIS Desktop 2.8.3 и 2.12

Я использую планшет Microsoft Surface Pro 4 с использованием QGIS Desktop 2.12 для редактирования некоторых слоев, хранящихся в базе данных Postgresql. Слои в планшете - это слои WFS, обслуживаемые QGIS Server.

Когда я включаю редактирование после вставки некоторых данных в слой для принудительной отправки и сохранения данных на сервере, иногда обновление не выполняется в базе данных.

Я вижу, что HTTP-запрос POST поступает на сервер нормально, но иногда я не вижу коммит (обновление) в базе данных, а иногда он работает нормально и выполняет коммит.

В журналах QGIS Server я вижу (я обновил данные 3 функций в QGIS Desktop):

//QGIS SERVER RECEIVED HTTP POST FROM QGIS DESKTOP

[4852][11:11:19] ********************new request*************** [4852][11:11:19] remote ip: 192.168.144.20 [4852][11:11:19] CONTENT_TYPE: text/xml [4852][11:11:19] HTTP_USER_AGENT: Mozilla/5.0 QGIS/2.8.2-Wien [4852][11:11:19] MAP:D:\OSGeo4W\apps\qgis\bin\alumbrado\alumbrado.qgs
[4852][11:11:19] REQUEST:Transaction
[4852][11:11:19] REQUEST_BODY:<Transaction xmlns="http://www.opengis.net/wfs"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0.0"
service="WFS" xsi:schemaLocation="http://www.qgis.org/gml
http://eudala2.getxo.net/qgis/qgis_mapserv.fcgi.exe?map=D:\OSGeo4W\apps\qgis\bin\alumbrado\alumbrado.qgs&amp;SERVICE=WFS&amp;VERSION=1.0.0&amp;REQUEST=DescribeFeatureType&amp;TYPENAME=getxo_alumbrado_arquetas_registros_cajas&amp;SRSNAME=EPSG:23030"
xmlns:gml="http://www.opengis.net/gml"><Update
xmlns="http://www.opengis.net/wfs"
typeName="getxo_alumbrado_arquetas_registros_cajas"><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">id_modelo</Name><Value
xmlns="http://www.opengis.net/wfs">0</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">alumbrado</Name><Value
xmlns="http://www.opengis.net/wfs">t</Value></Property><Filter
xmlns="http://www.opengis.net/ogc"><FeatureId
xmlns="http://www.opengis.net/ogc"
fid="getxo_alumbrado_arquetas_registros_cajas.3"/></Filter></Update><Update
xmlns="http://www.opengis.net/wfs"
typeName="getxo_alumbrado_arquetas_registros_cajas"><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">id_modelo</Name><Value
xmlns="http://www.opengis.net/wfs">0</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">alumbrado</Name><Value
xmlns="http://www.opengis.net/wfs">t</Value></Property><Filter
xmlns="http://www.opengis.net/ogc"><FeatureId
xmlns="http://www.opengis.net/ogc"
fid="getxo_alumbrado_arquetas_registros_cajas.4"/></Filter></Update><Update
xmlns="http://www.opengis.net/wfs"
typeName="getxo_alumbrado_arquetas_registros_cajas"><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">tipo</Name><Value
xmlns="http://www.opengis.net/wfs">A</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">tipo_tapa</Name><Value
xmlns="http://www.opengis.net/wfs">B</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">estado</Name><Value
xmlns="http://www.opengis.net/wfs">D</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">p_tierra_tipo_electrodo_tierra</Name><Value
xmlns="http://www.opengis.net/wfs">O</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">p_tierra_tipo_union_electrodo_tierra</Name><Value
xmlns="http://www.opengis.net/wfs">N</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">p_tierra_estado_union_tierra</Name><Value
xmlns="http://www.opengis.net/wfs">D</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">tipo_intervencion</Name><Value
xmlns="http://www.opengis.net/wfs">OTR</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">m_codcalle</Name><Value
xmlns="http://www.opengis.net/wfs">20</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">id_modelo</Name><Value
xmlns="http://www.opengis.net/wfs">0</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">alumbrado</Name><Value
xmlns="http://www.opengis.net/wfs">t</Value></Property><Filter
xmlns="http://www.opengis.net/ogc"><FeatureId
xmlns="http://www.opengis.net/ogc"
fid="getxo_alumbrado_arquetas_registros_cajas.5"/></Filter></Update></Transaction>
[4852][11:11:19] SERVICE:WFS
[4852][11:11:19] SRSNAME:EPSG:23030
[4852][11:11:19] VERSION:1.0.0
[4852][11:11:22] Request finished in 2977 ms

Хорошо, когда я просматриваю логи PostgreSQL, я вижу, что в обновлении есть предложение WHERE NULL, которое ничего не обновляет ..

//POSTGRESQL UPDATE QUERIES
2016-01-29 11:11:22 CET LOG:  00000: sentencia: UPDATE "public"."getxo_alumbrado_arquetas_registros_cajas" SET "id_modelo"=0,"alumbrado"='t' WHERE NULL
2016-01-29 11:11:22 CET UBICACIÓN:  exec_simple_query, src\backend\tcop\postgres.c:890
2016-01-29 11:11:22 CET LOG:  00000: sentencia: UPDATE "public"."getxo_alumbrado_arquetas_registros_cajas" SET "id_modelo"=0,"alumbrado"='t' WHERE NULL
2016-01-29 11:11:22 CET UBICACIÓN:  exec_simple_query, src\backend\tcop\postgres.c:890
2016-01-29 11:11:22 CET LOG:  00000: sentencia: UPDATE "public"."getxo_alumbrado_arquetas_registros_cajas" SET "tipo"='A',"tipo_tapa"='B',"estado"='D',"p_tierra_tipo_electrodo_tierra"='O',"p_tierra_tipo_union_electrodo_tierra"='N',"p_tierra_estado_union_tierra"='D',"tipo_intervencion"='OTR',"m_codcalle"='20',"id_modelo"=0,"alumbrado"='t'
WHERE NULL

В данных POST я вижу, что QGIS Server знает, какую функцию нужно обновить, используя внутренний номер "fid". Мой слой, с другой стороны, имеет поле "id" в качестве первичного ключа. Где-то, когда он отображает внутреннюю привязку QGIS на id моего слоя, он теряется и добавляет в запрос WHERE null вместо добавления где id = 1510.

Самое смешное, что они работают 40 дней, и у них эта проблема возникла только один раз, но с прошлой недели у них была эта проблема каждый день ... С тех пор иногда работает, а иногда нет. Я пересылаю HTTP-запрос POST от клиента, использующего прокси-сервер Fiddles, и тот же пост HTTP иногда работает, а иногда нет.

Я проверил это в QGIS Desktop 2.8, 2.10 и 2.12 и происходит во всех из них (я думаю, что QGIS Server - 2.6.1). Я также проверил это с различными слоями с тем же результатом.

Я не знаю, есть ли ошибка или есть какая-то конфигурация для слоя, который я не делаю должным образом на сервере ...


ОБНОВЛЕНИЕ 03/03/2016

Я обновил до QGIS Server и QGIS Desktop до 2.12.3 и проблема продолжается.

После многих дней испытаний я наконец-то обнаружил, когда возникла проблема. Это происходит, когда я сохраняю правки слоя в QGIS (через WFS-T), и в то же время карта Lizmap загружается другим пользователем. Lizmap также использует qgis-сервер.

Похоже, что при загрузке карты Lizmap загружает сервер, а при получении запроса на обновление WFS-T сервер QGIS не может правильно построить SQL-запрос UPDATE. Пример:

Если в момент получения сообщения WFS-T происходит загрузка Lizmap, запрос PostgreSQL, сгенерированный в qgis-server:

2016-03-03 11:47:30 CET LOG:  00000: sentencia: UPDATE "public"."getxo_alumbrado_tendido_canalizacion" SET "diametro"='22' WHERE NULL

С другой стороны, если qgis-сервер не передает данные загружаемой Lizmap, когда приходит WFS-T, сгенерированный запрос PostgreSQL:

2016-03-03 11:46:21 CET LOG:  00000: sentencia: UPDATE "public"."getxo_alumbrado_tendido_canalizacion" SET "diametro"='111' WHERE "id"::text='1' 

Обратите внимание на разницу в предложении where. Первый это ничего не делает. Второй работает нормально.

Я не знаю, могу ли я настроить Apache или какие-либо файлы конфигурации для qgis-server, чтобы решить эту проблему.

Я попытался дать гораздо больше оборудования для сервера (4 ядра и 16 ГБ оперативной памяти) без каких-либо изменений.


Я делаю все обновления программного обеспечения, используя OSGEO4W. Я где-то читал, что пакеты Apache и PHP не обновлялись годами. Я попытаюсь обновить их вручную и проверить, что версия apache или php не является причиной проблемы.


ОБНОВЛЕНИЕ 16/03/2016

Я обновил пакеты Apache и PHP, и проблема продолжается. После нескольких тестов я обнаружил, что если я сохраняю изменения редакции (через WFS) во время загрузки карты Lizmap, сохранение завершается неудачно, но в некоторых других случаях происходит сбой, хотя загрузка Lizmap отсутствует (на более низком томе). Это проблема в QGIS Server (qgis_mapserv.fcgi.exe).

Egidi
источник
Можете ли вы показать журналы сервера QGIS, когда он работает? Я предполагаю, что они выглядят одинаково, но мы должны подтвердить это предположение.
alexGIS
@alexGIS Да, они одинаковы. Я написал ответ с решением проблемы. Спасибо за вашу помощь!
Эгиди

Ответы:

7

Наконец, Матиас Кун , один из разработчиков QGIS, дал мне ключ.

Предложение WHERE создано для проверки типа первичного ключа таблицы. Это должно быть целое число, и в некоторых моих таблицах я видел тип Numeric (8,0).

Эти таблицы и первичные ключи были созданы сторонним приложением некоторое время назад.

Я изменил тип на Integer, и все тесты, которые я провел с тех пор, сработали (я сделал более 100 тестов редакции через WFS, на мой взгляд, достаточно, чтобы прийти к выводу, что проблема была решена)

Egidi
источник