mysql - 如何阻止 Rails 转义 SQL 中特定列的值?

标签 mysql ruby-on-rails geometry escaping geospatial

我正在尝试手动管理 Rails 模型中的一些几何(空间)列。

更新几何列时,我在 rails 中执行此操作:

self.geom="POINTFROMTEXT('POINT(#{lat},#{lng})')"

这是我希望在 SQL 更新中的值,以便由数据库评估。然而,当这已经通过事件记录魔法时,结果如下:

INSERT INTO `places` (..., `geom`) VALUES(...,'POINTFROMTEXT(\'POINT(52.2531519,20.9778386)\')')

换句话说,引号被转义了。这对其他列很好,因为它可以防止 sql 注入(inject),但不适用于此。这些值保证是 float ,我希望更新看起来像:

INSERT INTO `places` (..., `geom`) VALUES(...,'POINTFROMTEXT('POINT(52.2531519,20.9778386)')')

那么有没有办法关闭特定列的转义?或者更好的方法?

(我试过使用 GeoRuby+空间适配器,但空间适配器对我来说似乎太麻烦了,而且我不需要所有功能 - 因此我尝试直接使用)。

最佳答案

Rails Spatial Adapter应该准确地实现你所需要的。虽然,在我找到 GeoRuby & Spatial Adapter 之前,我是这样做的:

  • 在模型上有两个字段:一个文本字段和一个真实的几何字段
  • after_save Hook 上,我运行了如下内容:

    connection.execute "update mytable set geom_column=#{text_column} where id=#{id}"

但上面的解决方案只是一个 hack,还有其他问题:如果列允许 NULL 值,我无法创建空间索引,MySQL 不允许我设置默认值在几何列上,如果几何列没有设置值,save 方法将失败。

所以我会尝试 GeoRuby & Spatial Adapter,或者重用它的一些代码(在我的例子中,我正在考虑从 Spatial Adapter 代码中只提取 GIS-aware MysqlAdapter#quote 方法) .

关于mysql - 如何阻止 Rails 转义 SQL 中特定列的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1338492/

相关文章:

java - JDBC Mysql 错误?

mysql - 如何将zeppelin的所有笔记本合并为一个?

javascript - 如何在没有 gem 文件的情况下在 ruby​​-on-rails 中使用 javascript 库?

ruby-on-rails - ruby-2.2.4 缺少库

algorithm - 并行查找多个最近的射线段交叉点

javascript - 如何使用 d3.js 在圆内创建 voronoi 图

mysql - SQL复制一行然后更新

ruby-on-rails - 在暂存环境中运行迁移和 rake 任务时未加载模型

algorithm - Fortune 的算法和圆圈作为扫描线

mysql - PostgreSQL 在不乘列的情况下连接两个表