Máy chủ QGIS gửi CẬP NHẬT THÔNG TIN WHERE NULL đến postgis trong lớp WFS


9

Tôi đang chạy một máy chủ Windows Server 2012.

PostgreSQL 9.3.5, 64-bit

BÀI VIẾT 2.1.3

Máy chủ QGIS 2.6.1-2

Máy tính để bàn QGIS 2.8.3 và 2.12

Tôi đang sử dụng máy tính bảng Microsoft Surface Pro 4 bằng cách sử dụng QGIS Desktop 2.12 để chỉnh sửa một số lớp được lưu trữ trong cơ sở dữ liệu Postgresql. Các lớp trong máy tính bảng là các lớp WFS được phục vụ bởi Máy chủ QGIS.

Khi tôi chỉnh sửa sau khi chèn một số dữ liệu trong lớp để buộc dữ liệu được gửi và lưu trữ trong máy chủ đôi khi việc cập nhật không được thực hiện trong Cơ sở dữ liệu.

Tôi có thể thấy rằng yêu cầu POST http đến máy chủ ok, nhưng đôi khi tôi không thể thấy một cam kết (cập nhật) trong cơ sở dữ liệu và một số lần khác nó hoạt động tốt và thực hiện cam kết.

Trong nhật ký của Máy chủ QGIS tôi có thể thấy (Tôi đã cập nhật dữ liệu của 3 tính năng trong Máy tính để bàn của QGIS):

//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

Ok, khi tôi xem xét nhật ký PostgreSQL tôi có thể thấy rằng bản cập nhật có mệnh đề WHERE NULL, không cập nhật gì cả ..

//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

Tôi có thể thấy trong dữ liệu POST mà Máy chủ QGIS biết tính năng nào cần được cập nhật bằng cách sử dụng số "fid" nội bộ. Mặt khác, lớp của tôi có trường "id" làm khóa chính. Ở đâu đó khi ánh xạ từ fid nội bộ của QGIS đến id của lớp tôi sẽ bị mất và thêm WHERE null vào truy vấn thay vì thêm vào nơi id = 1510.

Điều buồn cười là họ đã làm việc được 40 ngày và họ chỉ gặp vấn đề này một lần, nhưng kể từ tuần trước họ đã gặp vấn đề này mỗi ngày ... Kể từ đó đôi khi làm việc và đôi khi không. Tôi gửi lại yêu cầu POST http từ proxy ysing Fiddles của khách hàng và cùng một bài đăng HTTP đôi khi không hoạt động và những lần khác thì không.

Tôi đã thử nghiệm nó trong QGIS Desktop 2.8, 2.10 và 2.12 và xảy ra trong tất cả chúng (Máy chủ QGIS là 2.6.1 tôi nghĩ). Tôi cũng đã thử nghiệm nó với các lớp khác nhau với cùng kết quả.

Tôi không biết nếu có lỗi hoặc có một số loại cấu hình cho lớp tôi không làm đúng trong máy chủ ...


CẬP NHẬT 03/03/2016

Tôi đã cập nhật lên Máy chủ QGIS và Máy tính để bàn QGIS lên 2.12.3 và vấn đề vẫn tiếp tục.

Sau nhiều ngày thử nghiệm cuối cùng tôi đã tìm thấy khi vấn đề xảy ra. Tôi xảy ra khi tôi lưu các chỉnh sửa của lớp trong QGIS (thông qua WFS-T) và đồng thời Bản đồ Lizmap đang được tải bởi người dùng khác. Lizmap cũng sử dụng máy chủ qgis.

Giống như khi tải bản đồ, Lizmap làm cho máy chủ bận rộn và khi yêu cầu cập nhật WFS-T được phục hồi, Máy chủ QGIS không có khả năng xây dựng truy vấn SQL CẬP NHẬT chính xác. Ví dụ:

Nếu có tải Lizmap tại thời điểm bài đăng WFS-T được nhận, truy vấn PostgreQuery được tạo trong qgis-server là:

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

Mặt khác, nếu qgis-server không phục vụ dữ liệu cho Lizmap đang tải khi WFS-T đến, truy vấn PostgreQuery được tạo là:

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

Lưu ý sự khác biệt trong mệnh đề where. Cái đầu tiên nó không làm gì cả. Cái thứ hai hoạt động tốt.

Tôi không biết liệu tôi có thể điều chỉnh Apache hoặc bất kỳ tệp cấu hình nào cho máy chủ qgis để khắc phục sự cố này không.

Tôi đã cố gắng cung cấp nhiều phần cứng hơn cho máy chủ (4 lõi và RAM 16 GB) mà không gặp sự cố.


Tôi đang thực hiện tất cả các bản cập nhật phần mềm bằng OSGEO4W. Tôi đã đọc ở đâu đó rằng các gói Apache và PHP đã không được cập nhật trong nhiều năm. Tôi sẽ cố gắng cập nhật chúng theo cách thủ công và kiểm tra xem phiên bản apache hoặc php không phải là nguyên nhân gây ra sự cố.


CẬP NHẬT 16/03/2016

Tôi đã cập nhật các gói Apache và PHP và vấn đề vẫn tiếp tục. Sau một vài thử nghiệm, tôi thấy rằng nếu tôi lưu các thay đổi phiên bản (thông qua WFS) trong khi tôi đang tải Bản đồ Lizmap, thì việc lưu không thành công, nhưng một số lần khác vẫn không thành công mặc dù không tải Lizmap (với âm lượng thấp hơn). Đây là một vấn đề trong Máy chủ QGIS (qgis_mapserv.fcgi.exe).


Bạn có thể hiển thị nhật ký máy chủ QGIS khi nó hoạt động không? Tôi cho rằng chúng trông giống nhau, nhưng chúng tôi cần xác nhận giả định đó.
alexGIS

@alexGIS Có họ giống nhau. Tôi đã viết một câu trả lời với giải pháp cho vấn đề. Cảm ơn bạn đã giúp đỡ!
Egidi

Câu trả lời:


7

Cuối cùng, Matthias Kuhn , một trong những nhà phát triển của QGIS đã đưa cho tôi chìa khóa.

Các mệnh đề WHERE được xây dựng kiểm tra các loại khóa chính của bảng. Nó phải là một số nguyên và trong một số bảng của tôi, tôi thấy rằng loại đó là Số (8,0).

Những bảng và khóa chính đã được tạo bởi ứng dụng của bên thứ ba một thời gian trước.

Tôi đã thay đổi loại thành Integer và tất cả các thử nghiệm tôi đã thực hiện kể từ đó đã hoạt động (Tôi đã thực hiện hơn 100 thử nghiệm phiên bản qua WFS, theo ý kiến ​​của tôi đủ để kết luận rằng vấn đề đã được giải quyết)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.