Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 通过Rails进行PostGIS查询时出现间歇性错误(字符串插值失败?)_Ruby On Rails_Postgresql_Docker_Postgis_Sidekiq - Fatal编程技术网

Ruby on rails 通过Rails进行PostGIS查询时出现间歇性错误(字符串插值失败?)

Ruby on rails 通过Rails进行PostGIS查询时出现间歇性错误(字符串插值失败?),ruby-on-rails,postgresql,docker,postgis,sidekiq,Ruby On Rails,Postgresql,Docker,Postgis,Sidekiq,在部署了一些Rails应用程序之后,我遇到了一个间歇性错误 这段代码在Sidekiq(5个进程,每个进程有10个线程)中运行,它在Docker容器中运行。 我可以在任何时候让数万个这样的工作排队 path = Path.find(path_id) nearby_nodes = Node.where("ST_DWITHIN(geog, ST_GeographyFromText(?), 25)", path.geog.to_s) 错误是: ActiveRecord::StatementInvali

在部署了一些Rails应用程序之后,我遇到了一个间歇性错误

这段代码在Sidekiq(5个进程,每个进程有10个线程)中运行,它在Docker容器中运行。 我可以在任何时候让数万个这样的工作排队

path = Path.find(path_id)
nearby_nodes = Node.where("ST_DWITHIN(geog, ST_GeographyFromText(?), 25)", path.geog.to_s)
错误是:

ActiveRecord::StatementInvalid: PG::InternalError: ERROR: parse error - invalid geometry
HINT: "01" <-- parse error at position 2 within geometry
PG::InternalError: ERROR: parse error - invalid geometry
HINT: "01" <-- parse error at position 2 within geometry
这个错误是:

ActiveRecord::StatementInvalid (PG::InternalError: ERROR:  parse error - invalid geometry)
HINT:  "00" <-- parse error at position 2 within geometry
  • Node.where(“ST_DWITHIN(geog,ST_GeographyFromText(?),25)”,path.geog.to_s)
    也成功生成相同的查询:
  • 在前一行中进行
    到_s
    的转换,作为某种迷信测试也有效:
  • 查询2-4通常可以工作,但在某些时候,只有在部署之后,其行为才会像查询1。 我不能让2-4像Rails控制台中的第一个查询那样运行。 查询2-4的唯一一次行为类似于部署后在Sidekiq作业中的第一次查询。 有时字符串转换好像不起作用

    以下是可能相关的gem/版本列表:

    • activerecord postgis适配器(6.0.0)
    • pg(1.2.3)
    • 轨道(6.0.2.2)
    • rgeo(2.1.1)
    • rgeo activerecord(6.2.1)
    • sidekiq(6.0.6)
    • Ruby 2.6.6
    • PostgreSQL 11.6
    • PostGIS 2.5.2
    • Docker 19.03.8,构建afacb8b7f0

      • 无需将地理信息转换为字符串,然后将其作为地理信息读回

        你可以直接试试

        Node.where("ST_DWITHIN(geog, ?, 25)", path.geog)
        

        也就是说,您可能确实有一些无效的几何图形

        我认为无效的几何图形会导致查询总是失败。不过,重新启动服务允许这些查询成功完成。我现在也很困惑,为什么我认为我需要
        ST_GeographyFromText
        ——这个查询没有它也可以工作。
        Node Load (5.1ms)  SELECT "nodes".* FROM "nodes" WHERE (ST_DWITHIN(geog, ST_GeographyFromText('POINT (-72.633932 42.206081)'), 25)) LIMIT $1  [["LIMIT", 11]]
        
        Node Load (2.3ms)  SELECT "nodes".* FROM "nodes" WHERE (ST_DWITHIN(geog, ST_GeographyFromText('POINT (-72.633932 42.206081)'), 25)) LIMIT $1  [["LIMIT", 11]]
        
        geog_string  = path.geog.to_s
        nearby_nodes = Node.where("ST_DWITHIN(geog, ST_GeographyFromText(?), 25)", geog_string)
        
        Node.where("ST_DWITHIN(geog, ?, 25)", path.geog)