繁体   English   中英

如何阻止Rails在SQL中为特定列转义值?

[英]How do I stop rails from escaping values in SQL for a particular column?

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

更新几何列时,我在rails中这样做:

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

这是我想要在SQL更新中被数据库评估的值。 但是,在通过主动录制魔术的时候,结果如下:

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

换句话说,引号被转义了。 这对于其他列也很好,因为它可以防止sql-injection,但是不能这样做。 这些值保证为浮点型,我希望更新如下所示:

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

那么有没有办法关闭特定列的转义? 还是更好的方法呢?

(我已经尝试过使用GeoRuby + spatial适配器,而对我来说,spatial适配器似乎过于麻烦,而且我不需要所有功能-因此尝试直接进行操作)。

  1. 您可以使用after_save方法,并通过直接的SQL UPDATE调用编写它们。 烦人,但应该可以。

  2. 您应该能够使用'execute'方法在数据库迁移中创建触发器...但是我从未尝试过。

  3. 挖掘ActiveRecord的计算功能:max / min / avg等。不确定after_save中的直接SQL调用是否能为您节省很多时间。 参见calculations.rb。

  4. 您可以修补引用属性的函数(查找POINTFROMTEXT,然后跳过引用)。 这很容易找到,因为所有方法都以引号开头。 以ActiveRecord :: Base #quote_value开头。

Rails空间适配器应该完全实现您所需要的。 虽然,在我找到GeoRuby&Spatial Adapter之前,我是这样做的:

  • 在模型上有两个字段:一个文本字段和一个实际几何字段
  • after_save钩子上,我运行了以下内容:

    connection.execute“更新mytable集geom_column =#{text_column},其中id =#{id}”

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

因此,我将改为尝试使用GeoRuby和Spatial Adapter,或重用其某些代码(就我而言,我考虑从Spatial Adapter代码中仅提取可识别GIS的MysqlAdapter#quote方法)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM