เซิร์ฟเวอร์ QGIS ส่งการอัปเดต ... WHERE NULL ไปยัง postgis ในเลเยอร์ WFS


9

ฉันใช้เซิร์ฟเวอร์ Windows Server 2012

PostgreSQL 9.3.5, 64-bit

POSTGIS 2.1.3

เซิร์ฟเวอร์ QGIS 2.6.1-2

QGIS Desktop 2.8.3 และ 2.12

ฉันใช้แท็บเล็ต Microsoft Surface Pro 4 โดยใช้ QGIS Desktop 2.12 เพื่อแก้ไขเลเยอร์บางอย่างในฐานข้อมูล Postgresql เลเยอร์ในแท็บเล็ตคือเลเยอร์ WFS ที่ให้บริการโดยเซิร์ฟเวอร์ QGIS

เมื่อฉัน toogle แก้ไขหลังจากใส่ข้อมูลบางอย่างในเลเยอร์เพื่อบังคับให้ส่งและเก็บข้อมูลในเซิร์ฟเวอร์บางครั้งการอัปเดตไม่ได้ทำในฐานข้อมูล

ฉันเห็นว่าคำขอ POST http มาถึงเซิร์ฟเวอร์แล้ว แต่บางครั้งฉันไม่เห็นคอมมิชชัน (อัปเดต) ในฐานข้อมูลและบางครั้งก็ทำงานได้ดีและยอมรับได้

ในบันทึกของเซิร์ฟเวอร์ QGIS ฉันสามารถเห็น (ฉันอัปเดตข้อมูลคุณลักษณะ 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 รู้ว่าคุณสมบัติใดที่จำเป็นต้องได้รับการอัพเดตโดยใช้หมายเลข "fid" ภายใน ในทางกลับกันเลเยอร์ของฉันมีฟิลด์ "id" เป็นคีย์หลัก ที่ไหนสักแห่งเมื่อทำการแมปจาก QGIS ภายใน fid ไปยัง id ของเลเยอร์ของฉันมันกำลังจะสูญหายและเพิ่ม WHERE null ให้กับเคียวรีแทนที่จะเพิ่มที่ id = 1510

สิ่งที่ตลกคือพวกเขาทำงานมา 40 วันแล้วและเฮ้เพิ่งมีปัญหานี้เพียงครั้งเดียว แต่เมื่อสัปดาห์ที่แล้วพวกเขามีปัญหานี้ทุกวัน ... ตั้งแต่นั้นมาบางครั้งก็ใช้งานได้และบางครั้งก็ไม่ใช่ ฉันส่งคำขอ HTTP POST http จากไคลเอนต์ ysing พร็อกซี Fiddles และบางครั้งโพสต์ HTTP เดียวกันใช้งานได้และบางครั้งก็ไม่ทำงาน

ฉันทดสอบใน QGIS Desktop 2.8, 2.10 และ 2.12 และเกิดขึ้นในพวกเขาทั้งหมด (เซิร์ฟเวอร์ QGIS คือ 2.6.1 ฉันคิดว่า) ฉันยังทดสอบกับเลเยอร์ต่าง ๆ ด้วยผลลัพธ์เดียวกัน

ฉันไม่รู้ว่ามีข้อผิดพลาดหรือมีการปรับแต่งเลเยอร์ที่ฉันทำไม่ถูกต้องในเซิร์ฟเวอร์ ...


อัพเดท 03/03/2559

ฉันอัพเดตเป็น QGIS Server และ QGIS Desktop เป็น 2.12.3 ทั้งคู่และปัญหายังคงมีอยู่

หลังจากการทดสอบหลายวันฉันก็พบว่าเมื่อปัญหาเกิดขึ้น ฉันเกิดขึ้นเมื่อฉันบันทึกการแก้ไขเลเยอร์ใน QGIS (ผ่าน WFS-T) และในเวลาเดียวกันLizmap Mapจะถูกโหลดโดยผู้ใช้รายอื่น Lizmap ยังใช้ qgis-server

ดูเหมือนว่าเมื่อโหลดแผนที่ Lizmap จะทำให้เซิร์ฟเวอร์ไม่ว่างและเมื่อมีการร้องขอการอัปเดต WFS-T อีกครั้งเซิร์ฟเวอร์ QGIS จะไม่สามารถสร้างแบบสอบถาม SQL UPDATE ได้อย่างถูกต้องตัวอย่าง:

หากมีการโหลด Lizmap ในเวลาที่ได้รับการโพสต์ WFS-T แบบสอบถาม 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-server ไม่ให้บริการข้อมูลไปยัง 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 คอร์และ RAM 16 GB) โดยไม่มีการเปลี่ยนแปลง


ฉันกำลังอัปเดตซอฟต์แวร์ทั้งหมดโดยใช้ OSGEO4W ฉันอ่านบางที่แพ็คเกจ Apache และ PHP ยังไม่ได้รับการปรับปรุงมานาน ฉันจะพยายามอัปเดตด้วยตนเองและตรวจสอบว่ารุ่น apache หรือ php ไม่ใช่สาเหตุของปัญหา


อัพเดท 16/03/2016

ฉันอัปเดตแพ็คเกจ Apache และ PHP และปัญหายังคงมีอยู่ หลังจากการทดสอบหลายครั้งฉันพบว่าถ้าฉันบันทึกการเปลี่ยนแปลงฉบับ (ผ่าน WFS) ในขณะที่ฉันโหลดแผนที่ Lizmap การบันทึกล้มเหลว แต่บางครั้งก็ล้มเหลวแม้ว่าจะไม่มีการโหลด Lizmap (ในปริมาณที่น้อยกว่า) มันเป็นปัญหาในเซิร์ฟเวอร์ QGIS (qgis_mapserv.fcgi.exe)


คุณสามารถแสดงบันทึกเซิร์ฟเวอร์ QGIS เมื่อใช้งานได้หรือไม่ ฉันสมมติว่าพวกเขาดูเหมือนกัน แต่เราต้องยืนยันสมมติฐานนั้น
alexGIS

@alexGIS ใช่พวกเขาเหมือนกัน ฉันเขียนคำตอบพร้อมวิธีแก้ไขปัญหาแล้ว ขอบคุณสำหรับความช่วยเหลือของคุณ!
Egidi

คำตอบ:


7

ในที่สุดMatthias Kuhnหนึ่งในนักพัฒนาของ QGIS ได้มอบกุญแจให้ฉัน

ส่วนคำสั่ง WHEREถูกสร้างขึ้นเพื่อตรวจสอบประเภทของคีย์หลักของตาราง มันควรจะเป็นจำนวนเต็มและในบางส่วนของตารางของฉันฉันเห็นว่าประเภทเป็นตัวเลข (8,0)

ตารางและคีย์หลักเหล่านั้นถูกสร้างขึ้นโดยแอปของบุคคลที่สามเมื่อนานมาแล้ว

ฉันเปลี่ยนประเภทเป็นจำนวนเต็มและการทดสอบทั้งหมดที่ฉันทำหลังจากนั้นได้ทำงาน (ฉันได้ทำการทดสอบมากกว่า 100 ครั้งผ่าน WFS เพียงพอแล้วในความคิดของฉันที่จะสรุปว่าปัญหาได้รับการแก้ไขแล้ว)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.