QGIS 서버가 UPDATE… WHERE NULL을 WFS 계층의 postgis로 보내는 중


9

Windows Server 2012 서버를 실행하고 있습니다.

PostgreSQL 9.3.5, 64 비트

POSTGIS 2.1.3

QGIS 서버 2.6.1-2

QGIS Desktop 2.8.3 및 2.12

Postgresql 데이터베이스에 저장된 일부 레이어를 편집하기 위해 QGIS Desktop 2.12를 사용하는 Microsoft Surface Pro 4 태블릿을 사용하고 있습니다. 태블릿의 계층은 QGIS Server가 제공하는 WFS 계층입니다.

서버에 데이터를 전송하고 저장하기 위해 레이어에 일부 데이터를 삽입 한 후 편집을 수행 할 때 데이터베이스에서 업데이트가 수행되지 않는 경우가 있습니다.

POST http 요청이 서버에 정상적으로 도착한 것을 알 수 있지만 때로는 데이터베이스에서 커밋 (업데이트)을 볼 수 없으며 다른 경우에는 정상적으로 작동하고 커밋을 수행합니다.

QGIS Server의 로그에서 볼 수 있습니다 (QGIS Desktop에서 3 개의 기능 데이터를 업데이트했습니다).

//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 서버가 내부 "fid"번호를 사용하여 업데이트해야하는 기능을 알고 있음을 알 수 있습니다. 반면에 내 레이어에는 "id"필드가 기본 키로 있습니다. 어딘가에서 QGIS 내부 fid에서 내 계층의 ID로 매핑 할 때 손실되고 id = 1510을 추가하는 대신 쿼리에 null을 추가합니다.

재밌는 점은 40 일 동안 일해 왔으며이 문제는 한 번만 발생했지만 지난 주부터 매일이 문제가 발생했습니다. 클라이언트 ysing Fiddles 프록시에서 POST http 요청을 다시 보내고 동일한 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-server도 사용합니다.

맵을로드 할 때 Lizmap은 서버를 사용 중으로 만들고 WFS-T 업데이트 요청을 받으면 QGIS Server가 UPDATE SQL 쿼리를 올바르게 빌드 할 수 없습니다.

WFS-T 게시물을 수신 할 때 Lizmap 로딩이있는 경우 qgis-server에서 생성 된 PostgreSQL 쿼리는 다음과 같습니다.

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

반면에, qgis-server가 WFS-T가 도착했을 때 로딩하는 Lizmap에 데이터를 제공하지 않는 경우 생성 된 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 절의 차이점에 유의하십시오. 첫 번째는 아무것도하지 않습니다. 두 번째는 정상적으로 작동합니다.

이 문제를 해결하기 위해 qgis-server의 Apache 또는 구성 파일을 조정할 수 있는지 여부를 모르겠습니다.

나는 chnage없이 서버에 훨씬 더 많은 하드웨어 (4 코어 및 16GB RAM)를 제공하려고했습니다.


OSGEO4W를 사용하여 모든 소프트웨어를 업데이트하고 있습니다. 나는 아파치와 PHP 패키지가 수년간 업데이트되지 않은 곳을 읽었습니다. 수동으로 업데이트하고 아파치 또는 PHP 버전이 문제의 원인이 아닌지 확인하려고합니다.


2016 년 3 월 16 일 업데이트

Apache 및 PHP 패키지를 업데이트했는데 문제가 계속됩니다. 몇 가지 테스트를 한 후 Lizmap Map을로드하는 동안 WFS를 통해 에디션 변경 사항을 저장하면 저장이 실패하지만 Lizmap 이로 드되지 않지만 (낮은 볼륨) 다른 ​​시간이 계속 실패합니다. QGIS 서버 (qgis_mapserv.fcgi.exe)의 문제입니다.


QGIS 서버 로그가 작동 할 때이를 표시 할 수 있습니까? 나는 그들이 똑같아 보인다고 가정하지만 그 가정을 확인해야합니다.
alexGIS

@alexGIS 그렇습니다. 문제에 대한 해결책으로 답변을 작성했습니다. 당신의 도움을 주셔서 감사합니다!
Egidi

답변:


7

마지막으로 QGIS 개발자 중 한 명인 Matthias Kuhn 은 저에게 열쇠를 줬습니다.

WHERE 절은 확인 내장되어 기본 키의 유형 테이블을. 그것은 정수 여야 내 일부 테이블에서 나는 타입이 숫자 (8,0) 것을 보았다.

이 테이블과 기본 키는 얼마 전에 타사 앱에서 만들었습니다.

유형을 Integer로 변경하고 그 이후로 수행 한 모든 테스트가 작동했습니다 (WFS를 통해 100 개 이상의 에디션 테스트를 수행했으며 문제가 해결되었다고 생각합니다)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.