2012-05-31 4 views
10

Hat etwas für einen halben Tag gegoogelt und ich kann keine Probe einer vorbereiteten INSERT-Anweisung mit dem PG-Edelstein (Postgresql Ruby Gem) finden.Beispiel für eine vorbereitete INSERT-Anweisung mit Ruby pg Gem

Ich habe versucht, diese (nach an den Edelstein docs suchen):

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

Aber ich erhalte den folgenden Fehler:

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>' 
+0

Können Sie die Datei schreiben bitte? Das könnte helfen, da es ein Syntaxfehler ist - es könnte weiter zurück begonnen haben – Jwosty

+0

@Jwosty: Der 'ERROR: ... (PG :: Error)' zeigt an, dass der Fehler von 'pg' kommt und nicht von Ruby. –

+0

Oh, das macht Sinn ... Es sah so aus, als wäre es ein Syntaxfehler beim OP. Ich habe nicht bemerkt, dass der Edelstein den Fehler ausgelöst hat (ich habe diesen nie zuvor benutzt); Vielen Dank! – Jwosty

Antwort

27

Die pg gem möchte, dass Sie nummerierte Platzhalter verwenden ($1, $2 , ...) anstelle von positionellen Platzhaltern (?):

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.' ]) 

The fine manual hat folgendes sagen:

- (PGresult) prepare(stmt_name, sql[, param_types ])
[...]
PostgreSQL bind parameters are represented as $1, $1, $2, etc., inside the SQL query.

Und wieder für exec_prepared:

PostgreSQL bind parameters are represented as $1, $1, $2, etc., inside the SQL query. The 0th element of the params array is bound to $1, the 1st element is bound to $2, etc.

+1

Danke! Das hat den Trick gemacht! Doh, ich weiß nicht, wie ich das vermisst habe! – iphone007

+0

Wann lohnt es sich, die Anweisung vor der Ausführung vorzubereiten? –

+1

@Martin: Wenn Sie dieselbe Anweisung mehrmals mit unterschiedlichen Werten ausführen möchten. Einige DB-Schnittstellen erfordern eine explizit vorbereitete Anweisung, um Platzhalter zu verwenden, aber das 'pg'-Juwel lässt Platzhalter mit [' exec'] (http://rubydoc.info/gems/pg/PG/Connection#exec-instance_method) verwenden. . –

Verwandte Themen