0

Postgres データベースにデータを挿入するために PG gem を使用していますが、タイムスタンプを含むデータを挿入しようとすると、データベースが更新されません。IRB から実行したコードは次のとおりです。

 :001 > require 'pg'
 => true 
 :002 > conn = PGconn.open(:dbname => 'my_db')
 => #<PG::Connection:0x8fa4a94 @socket_io=nil, @notice_receiver=nil, @notice_processor=nil>  
 :003 >   conn.prepare('statement1', 'insert into sites (url, note, type, last_viewed) values ($1, $2, $3, $4)')
 => #<PG::Result:0x8f3c19c @connection=#<PG::Connection:0x8fa4a94 @socket_io=nil, @notice_receiver=nil, @notice_processor=nil>> 
 :004 >   conn.exec_prepared('statement1', [ 'digg.com', 'news site', 3, date_trunc('second', #{conn.escape_string(current_timestamp)) ] )
 :005 >

この問題は、一重引用符をエスケープする方法に関連していると思います。escape_string以前のバージョンのコードを 4 行目で実行したときにエラー メッセージが表示されたため、PG gem のメソッドを含め始めました。

004 >   conn.exec_prepared('statement1', [ 'digg.com', 'news site', 3, date_trunc('second', current_timestamp) ] )
NameError: undefined local variable or method `current_timestamp' for main:Object
from (irb):4
from /home/user/.rvm/rubies/ruby-2.0.0-p247/bin/irb:16:in `<main>'
4

1 に答える 1

1

問題は、Ruby と SQL を奇妙に混在させていることです。たとえば、current_timestampSQLconn.escape_stringは Ruby です。この場合、準備されたステートメントで SQL をインライン化します。

conn.prepare(
  'statement1',
  %q{
    insert into sites (url, note, type, last_viewed)
    values ($1, $2, $3, date_trunc('second', current_timestamp))
  }
)

SQLに何も補間していないので、これは完全に安全です。INSERTにもう少しSQLを投げているだけです。

于 2013-11-05T03:56:45.737 に答える