1

我想在我的Rails應用程序使用這樣的查詢:Hstore ActiveRecord的查詢和值

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

除了我需要使用,爲了不引入通配符(或命名PARAMS) 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?

謝謝!

回答

2

有比使用文本到hstore鑄造其它ways to construct an hstore

  • hstore(text[]):從陣列中,其可以是一個鍵/值陣列或二維陣列構造hstore。
  • hstore(text[], text[]):從單獨的鍵和值數組構建一個hstore。
  • hstore(text, text):make single-item 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不應該做一團糟。我也轉而使用指定的佔位符,不止一對匿名佔位符變得混亂。