【发布时间】:2021-09-30 12:45:01
【问题描述】:
我正在尝试使用子查询清理 SQL 查询,但每次我遇到语法错误或无效几何错误。为了进行消毒,我使用的是 sanitize_sql_array 函数。
SQL 查询
SELECT ST_Distance('SRID=4326;POINT(0 0)'::geometry, subqry.centroid)
FROM
(SELECT ST_AsText(ST_Centroid('SRID=4326;MULTIPOINT ( 0 0, 0 0, 0 0, 0 0 )'))::geography as centroid
) as subqry;
第一种方法
ActiveRecord::Base::sanitize_sql_array(["select ST_Distance('SRID=4326;POINT(? ?)'::geometry, :sub_query", sub_query: "(SELECT ST_Centroid(SRID=4326;'MULTIPOINT ( ? ?, ? ?, ? ?, ? ? )'::geometry) as centroid) as sub_query", min_longitude, min_latitude, min_longitude, min_latitude, min_longitude, max_latitude, max_longitude, min_latitude, max_longitude, max_latitude])
第二种方法
这里我得到“SRID=4326; SE”
ActiveRecord::Base::sanitize_sql_array(["ST_Distance('SRID=4326;POINT(? ?)'::geometry, 'SRID=4326; SELECT ST_AsText(ST_Centroid(MULTIPOINT ( ? ?, ? ?, ? ?, ? ? ))) as centroid'::geometry)", min_longitude, min_latitude, min_longitude, min_latitude, min_longitude, max_latitude, max_longitude, min_latitude, max_longitude, max_latitude])
PostGIS 中的 st_centroid 和 st_distance 方法示例
st_centroid
SELECT ST_AsText(ST_Centroid('MULTIPOINT ( -1 0, -1 2, -1 3, -1 4, -1 7, 0 1, 0 3, 1 1, 2 0, 6 0, 7 8, 9 8, 10 6 )'));
st_distance
SELECT ST_Distance(
'SRID=4326;POINT(-72.1235 42.3521)'::geometry,
'SRID=4326;LINESTRING(-72.1260 42.45, -72.123 42.1546)'::geometry
);
【问题讨论】:
-
我对 Ruby/Rails 知之甚少,但是有没有办法使用 Bound 参数?依赖字符串解析似乎是不安全的。只是思考的食物。
-
你想清理什么?是否只是
POINT(? ?)内的整数?编辑:没关系,我看到它们是坐标 -
我将通过 lat & long 内点。在我上面的问题中,我给出了 0 作为示例
-
如果所有坐标都是小数或整数,您可以在运行查询之前通过检查类来验证它们
-
我想通过 sanitize 方法进行验证,因为它的参数将来自外部 API
标签: sql ruby-on-rails ruby ruby-on-rails-6 sanitization