14

約半日グーグルで調べましたが、pg gem (postgresql ruby​​ gem) を使用して準備された INSERT ステートメントのサンプルが見つかりません。

私はこれを試しました(宝石のドキュメントを見た後):

def test2
    conn = PG.connect( dbname: 'db1' )
    conn.prepare("statement1", 'INSERT INTO table1 (id, name, profile) VALUES (?, ?, ?)')
end

しかし、次のエラーが表示されます。

pgtest.rb:19:in `prepare': ERROR:  syntax error at or near "," (PG::Error)
LINE 1: INSERT INTO table1 (id, name, profile) VALUES (?, ?, ?)
                                                        ^
from pgtest.rb:19:in `test2'
from pgtest.rb:25:in `<main>'
4

1 に答える 1

34

pggemでは、位置プレースホルダー( )ではなく、番号付きプレースホルダー(、、 ...)$1を使用する必要があります。$2?

conn = PG.connect(:dbname => 'db1')
conn.prepare('statement1', 'insert into table1 (id, name, profile) values ($1, $2, $3)')
conn.exec_prepared('statement1', [ 11, 'J.R. "Bob" Dobbs', 'Too much is always better than not enough.' ])

すばらしいマニュアルには次のように書かれています。

- (PGresult) prepare(stmt_name, sql[, param_types ])
[...]
PostgreSQLバインドパラメータは、SQLクエリ内で$ 1、$ 1、$2などとして表されます。

そして再びexec_prepared

PostgreSQLバインドパラメータは、SQLクエリ内で$ 1、$ 1、$2などとして表されます。params配列の0番目の要素は$1にバインドされ、1番目の要素は$2にバインドされます。

于 2012-05-31T21:24:26.173 に答える