2012-05-31 20 views
10

Realicé búsquedas en Google durante aproximadamente medio día y no puedo encontrar ninguna muestra de una declaración INSERT preparada utilizando la gema pg (gema de rubíes postgresql).Ejemplo de una declaración INSERT preparada usando ruby ​​pg gem

yo probamos este (después de mirar los documentos de la gema):

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

pero me da el siguiente error:

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

Se puede publicar todo el archivo por favor? Eso podría ayudar, ya que es un error de sintaxis, puede haber comenzado más atrás – Jwosty

+0

@Jwosty: El 'ERROR: ... (PG :: Error)' indica que el error proviene de 'pg' en lugar de Ruby. –

+0

Oh, eso tiene sentido ... Parecía que se trataba de un error de sintaxis por parte del OP. No me di cuenta de que la gema estaba arrojando el error (nunca he usado este antes); ¡Gracias! – Jwosty

Respuesta

27

La gema pg quiere que uses marcadores numerados ($1, $2 , ...) en lugar de marcadores de posición posicionales (?):

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

El fine manual tiene esto que decir:

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

Y de nuevo por 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

Gracias! Eso hizo el truco! ¡Doh, no sé cómo me lo perdí! – iphone007

+0

¿Cuándo vale la pena preparar la declaración antes de ejecutarla? –

+1

@Martin: si desea ejecutar la misma instrucción varias veces con diferentes valores. Algunas interfaces DB requieren el uso explícito de declaraciones preparadas para usar marcadores de posición, pero la gema 'pg' le permite usar marcadores de posición con [' exec'] (http://rubydoc.info/gems/pg/PG/Connection#exec-instance_method) . –

Cuestiones relacionadas