2017-01-01 34 views
3

我有這樣的代碼:插件組到PostgreSQL的地圖準備的語句

require 'pg' 
a = ["bla","foo","bar","test","wow"] 

begin 
con = PG.connect :dbname => 'base', :user => 'thatsme' 

a.map do |e| 
    con.prepare('statement1','INSERT INTO keywords (keyword, created_at, updated_at) VALUES ($1, $2, $3)') 
    con.exec_params('statement1', ["#{e}", '2017-01-01 07:29:33.096192', '2017-01-01 07:29:33.096192' ]) 
end 

這將導致一個錯誤,這是

ERROR: syntax error at or near "statement1" 

我不明白這一點。我錯過了一些東西...

+1

好像你應該使用字符串插值雙引號: 'con.exec_params( '語句1',[ 「#{E}」 ,...' – Ilya

+0

這也是真的,謝謝!但是這並不會導致錯誤消失。我仍然有'ERROR:語法錯誤在'statement1'或'near'附近'' – thiebo

+0

''#{e}「'如果你想確定'e'是一個字符串,可以使用'e.to_s,儘管驅動程序經常會自動進行這種轉換。另外,不要碰撞低級驅動程序,而是嘗試和用一些抽象的東西,比如[Sequel](h TTP://sequel.jeremyevans.net)。 – tadman

回答

2

exec_params方法不採用預先準備好的語句名稱,這不是支持的參數。

您可能打算使用具有該參數的send_query_prepared方法。

這是你的代碼的重構的版本:

a.each_with_index do |r, i| 
    con.prepare("statement_#{i}","INSERT INTO keywords (keyword, created_at, updated_at) VALUES ($1, $2, $3)") 
    con.exec_prepared("statement_#{i}", [r, '2017-01-01 07:29:33.096192', '2017-01-01 07:29:33.096192' ]) 
end 

您應該使用each,而不是map如果你不關注結果,作爲map創建重寫條目的臨時數組。另外each_with_index避免了手動操作i

0

這裏的解決方案(如果這能幫助別人):

con = PG.connect :dbname => 'base', :user => 'thatsme' 
i = 1; 

a.map do |r| 
    con.prepare("statement_#{i}","INSERT INTO keywords (keyword, created_at, updated_at) VALUES ($1, $2, $3)") 
    con.exec_prepared("statement_#{i}", [r.to_s, '2017-01-01 07:29:33.096192', '2017-01-01 07:29:33.096192' ]) 
    i += 1 
end 
+0

我已經更新了我的答案,以解決這個問題以及其他問題問題 – tadman

+0

在循環之前,您應該只准備一次查詢。 – julp