2012-05-31 14 views
10

Czy próbowałeś google przez około pół dnia i nie mogę znaleźć żadnej próbki przygotowanej instrukcji INSERT za pomocą pg gem (postgresql ruby ​​gem).Przykład przygotowanej instrukcji INSERT przy użyciu ruby ​​pg gem

Próbowałem to (po patrząc na docs GEM):

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

Ale pojawia się następujący błąd:

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

można pisać cały plik proszę? To może pomóc, ponieważ jego błąd składniowy - mógł zacząć się dalej wstecz – Jwosty

+0

@Jwosty: 'BŁĄD: ... (PG :: Błąd)' wskazuje, że błąd pochodzi z 'pg' zamiast z Ruby. –

+0

Och, to ma sens ... Wyglądało na to, że był to błąd składniowy ze strony OP. Nie zdawałem sobie sprawy, że klejnot rzuca błąd (nigdy wcześniej nie użyłem tego); dzięki! – Jwosty

Odpowiedz

27

pg gem chce, aby korzystać z ponumerowanych zastępcze ($1, $2 , ...) zamiast elementów zastępczych (?):

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 ma do powiedzenia:

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

i znowu dla 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

Dzięki! To wystarczy! Doh, nie wiem, jak to przegapiłem! – iphone007

+0

Kiedy warto przygotować oświadczenie przed jego wykonaniem? –

+1

@Martin: Jeśli chcesz wykonać tę samą instrukcję kilka razy z różnymi wartościami. Niektóre interfejsy DB wymagają jawnie przygotowanych instrukcji użycia, aby używać symboli zastępczych, ale gem 'pg' pozwala używać symboli zastępczych z [' exec'] (http://rubydoc.info/gems/pg/PG/Connection#exec-instance_method) . –

Powiązane problemy