【问题标题】:Hstore ActiveRecord query using wildcards for both keys and valuesHstore ActiveRecord 使用通配符查询键和值
【发布时间】:2014-02-17 11:19:35
【问题描述】:

我想在我的 rails 应用中使用这样的查询:

Series.where("dimensions @> 'a=>1, b=>2'::hstore")

除了我需要使用通配符(或命名参数)以免引入 SQL 注入错误:

Series.where("dimensions @> '?=>?, ?=>?'::hstore", 'a', '1', 'b', '2')

但是后者不起作用,因为 hstore 不希望键/值用单引号引起来。这是错误:

PG::SyntaxError: ERROR:  syntax error at or near "a"
LINE 1: ... "series".* FROM "series"  WHERE (dimensions @> ''a'=>'1', '...
                                                             ^
: SELECT "series".* FROM "series"  WHERE (dimensions @> ''a'=>'1', 'b'=>'2''::hstore)

在 hstore 中使用通配符的正确方法是什么?

谢谢!

【问题讨论】:

    标签: ruby-on-rails postgresql activerecord rails-activerecord hstore


    【解决方案1】:

    除了使用 text-to-hstore 转换之外,还有其他 ways to construct an hstore

    • hstore(text[]):从数组构造hstore,可以是key/value数组,也可以是二维数组。
    • hstore(text[], text[]):从单独的键和值数组构造一个 hstore。
    • hstore(text, text): 制作单项 hstore。

    所以你可以做这些事情:

    hstore('k', 'v')                             -- "k"=>"v"
    hstore(array['k1', 'k2'], array['v1', 'v2']) -- "k1"=>"v1", "k2"=>"v2"
    hstore(array['k1', 'v1', 'k2', 'v2'])        -- "k1"=>"v1", "k2"=>"v2"
    hstore(array[['k1', 'v1'], ['k2', 'v2']])    -- "k1"=>"v1", "k2"=>"v2"
    

    也许你会更成功:

    Series.where('dimensions @> hstore(array[:k1, :v1, :k2, :v2])',
      :k1 => 'a', :v1 => '1',
      :k2 => 'b', :v2 => '2'
    )
    

    该版本只有一级引号,因此 AR 不会造成混乱。在此过程中,我还切换到命名占位符,不止几个匿名占位符会让人感到困惑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-11
      • 2015-01-25
      • 1970-01-01
      • 2015-12-25
      • 2017-08-07
      • 1970-01-01
      • 2015-08-12
      相关资源
      最近更新 更多