我可以调试无法编辑的,来自外部源的PostgreSQL查询吗?

时间:2018-07-29 01:23:03

标签: postgresql debugging postgis

我看到了如何调试存储为数据库中的函数的查询。但是我的问题是使用外部QGIS插件,该插件通过网络连接到我的Postgres 10.4,并执行复杂的查询和计算,并将结果存储回PostGIS表中:

FOR r IN c LOOP
    SELECT
        (1 - ST_LineLocatePoint(path.geom, ST_Intersection(r.geom, path.geom))) * ST_Length(path.geom)
    INTO
        station
(continues ...)

当它出错时,它只返回该行号作为失败的位置,但不知道通过数百个功能在循环中的位置。 (当它失败时,它处理的所有功能都不会存储到输出表中。)我完全不了解插件和SQL来破解外部查询,并且我怀疑插件作者是否认为这是合理的任务本应包含更多揭示性的调试消息。

那么有什么办法可以从服务器端使用pgAdmin4(或其他任何工具)来监视查询过程?即使能够在循环中第一次或以后查看它是否失败,也将极大地帮助您。知道失败时的循环计数将使我指向确切的问题功能。能够看到“站”或“ r.geom”将使其变得更加容易。

如果该过程非常缓慢或干扰其他查询,则完全可以,我是该服务器上的唯一用户。

1 个答案:

答案 0 :(得分:0)

这实际上不是观看RiverGIS查询的方法,但这是我发现的最好的方法。它从RiverGIS代码中提取失败的ST_Intersects()调用,并在您的控制下运行它,您可以在其中显示所需的任何线索。

完全不知道RiverGIS问题可能在哪里时,请运行以下SQL查询:

SELECT
    xs."XsecID" AS "XsecID",
    xs."ReachID" AS "ReachID",
    xs."Station" AS "Station",
    xs."RiverCode" AS "RiverCode",
    xs."ReachCode" AS "ReachCode",
    ST_Intersection(xs.geom, riv.geom) AS "Fraction"
FROM
    "<your project name>"."StreamCenterlines" AS riv,
    "<your project name>"."XSCutLines" AS xs
WHERE
    ST_Intersects(xs.geom, riv.geom)
ORDER BY xs."ReachID" ASC, xs."Station" DESC

显然将<your project name>替换为QGIS项目名称。

如果将“ StreamCenterlines”替换为“ BankLines”,则也适用于BankLines步骤。可能可以适应ST_Intersects()失败而无端的其他情况。

您将获得一个列表,其中包含较短的几何形状字符串(用于表示良好的横截面)和双倍长度的字符串(用于表示不良的横截面)。可能需要大量扩大显示列才能看到此内容。

在pgAdmn4或QGIS3->数据库-> DB管理器->中为我工作(单击扳手图标)。您只能选择坏行,但我认为背景信息会有所帮助。