在生成的列上处理 pg_error
Handle pg_error on generated columns
我有一个 table,其中包含一些 PostGIS 相关数据。这些数据在插入或更新时自动生成。
ALTER TABLE "Room" ADD COLUMN geolocation geography(Polygon, 4326) GENERATED ALWAYS AS (ST_MakePolygon("polygon"::geometry)) STORED;
有时多边形列上提供的数据可能不适合生成函数并导致错误。我想处理这个错误并在它失败时设置一个默认值。
-- 最后的选择--
- 创建 postgres 函数来处理此任务,但会使工作与代码库分离。
当您使用 ST_MakePolygon
时,我假设列 "polygon"
包含 LINESTRING,有时它们无效,这会在您的 DDL 语句中引发错误。
您可以做的是创建一个 CASE
条件,在尝试创建多边形之前验证几何。例如,此查询检查几何是否有效,是否为 LINESTRING 以及在尝试创建 POLYGON 之前其环是否闭合。如果失败,它会生成一个 (如果需要,将其更改为 NULL
):
ALTER TABLE "Room"
ADD COLUMN geolocation geography(Polygon, 4326)
GENERATED ALWAYS AS (
CASE
WHEN ST_IsValid("polygon") AND
GeometryType("polygon")='LINESTRING' AND
ST_IsClosed("polygon"::geometry) THEN
ST_MakePolygon("polygon"::geometry)
ELSE
'POLYGON EMPTY'
END) STORED;
演示:db<>fiddle
我有一个 table,其中包含一些 PostGIS 相关数据。这些数据在插入或更新时自动生成。
ALTER TABLE "Room" ADD COLUMN geolocation geography(Polygon, 4326) GENERATED ALWAYS AS (ST_MakePolygon("polygon"::geometry)) STORED;
有时多边形列上提供的数据可能不适合生成函数并导致错误。我想处理这个错误并在它失败时设置一个默认值。
-- 最后的选择--
- 创建 postgres 函数来处理此任务,但会使工作与代码库分离。
当您使用 ST_MakePolygon
时,我假设列 "polygon"
包含 LINESTRING,有时它们无效,这会在您的 DDL 语句中引发错误。
您可以做的是创建一个 CASE
条件,在尝试创建多边形之前验证几何。例如,此查询检查几何是否有效,是否为 LINESTRING 以及在尝试创建 POLYGON 之前其环是否闭合。如果失败,它会生成一个 NULL
):
ALTER TABLE "Room"
ADD COLUMN geolocation geography(Polygon, 4326)
GENERATED ALWAYS AS (
CASE
WHEN ST_IsValid("polygon") AND
GeometryType("polygon")='LINESTRING' AND
ST_IsClosed("polygon"::geometry) THEN
ST_MakePolygon("polygon"::geometry)
ELSE
'POLYGON EMPTY'
END) STORED;
演示:db<>fiddle