QGIS Server将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

我正在使用使用QGIS Desktop 2.12的Microsoft Surface Pro 4平板电脑来编辑存储在Postgresql数据库中的某些图层。数位板中的层是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 Server知道需要使用内部“ fid”编号来更新哪些功能。另一方面,我的图层具有“ id”字段作为主键。当它执行从QGIS内部FID到我的图层ID的映射时,它迷路了,并向查询中添加WHERE null而不是在id = 1510处添加。

有趣的是,他们已经工作40天了,嘿,只遇到过一次这个问题,但是自上周以来,他们每天都遇到这个问题……从那时起,有时会工作,有时却没有。我从客户端ying 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

另一方面,如果在WFS-T到达时qgis-server没有将数据提供给正在加载的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或任何配置文件来解决此问题。

我尝试给服务器提供更多硬件(4核和16 GB RAM),而没有任何改动。


我正在使用OSGEO4W进行所有软件更新。Ia读到某个地方说Apache和PHP软件包多年没有更新。我将尝试手动更新它们,并检查apache或php版本是否不是问题的原因。


更新16/03/2016

我更新了Apache和PHP软件包,问题仍然存在。经过几次测试后,我发现如果在加载Lizmap地图时(通过WFS)保存版本更改,保存将失败,但是其他时间(尽管未加载Lizmap)(即使音量较小)也会失败。这是QGIS Server(qgis_mapserv.fcgi.exe)中的问题。


QGIS服务器工作时可以显示日志吗?我假设它们看起来相同,但是我们需要确认这一假设。
alexGIS '16

@alexGIS是的,它们是相同的。我已经写出了解决该问题的答案。谢谢你的帮助!
Egidi

Answers:


7

最后,QGIS的开发者之一Matthias Kuhn给了我钥匙。

建立WHERE子句以检查表主键的类型。它应该是Integer,在我的一些表中,我看到类型是Numeric(8,0)。

这些表和主键是由第三方应用程序在一段时间前创建的。

我将类型更改为Integer,此后我进行的所有测试都起作用(我已经通过WFS进行了100多次版本测试,我认为足以得出问题已经解决的结论)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.