2012-05-31 16 views
10

Yaklaşık yarım gün boyunca biraz googling yaptım ve pg gem (postgresql ruby ​​gem) kullanarak hazırlanmış bir INSERT deyimi örneği bulamıyorum. Hazırlanmış bir INSERT deyimi, ruby ​​pg gem kullanarak örnek

I (mücevher docs baktıktan sonra) bu çalıştı:

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

Ama aşağıdaki hatayı alıyorum:

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

dosyanın tamamını lütfen gönderebilir miyim? Bu, bir sözdizimi hatası olduğundan, yardımcı olabilir - daha ileride geri dönmüş olabilir – Jwosty

+0

@Jwosty: "HATA: ... (PG :: Hata)", hatanın Ruby yerine "pg" den geldiğini gösterir. –

+0

Oh, bu mantıklı ... OP'nin kısmında bir sözdizimi hatası gibi görünüyordu. Gem'in hatayı attığının farkında değildim (bunu daha önce hiç kullanmadım); Teşekkürler! – Jwosty

cevap

27

pg mücevher $2, sen numaralı tutucuları ($1 kullanmak istiyor , ...) konumsal yer tutucular yerine (?):

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

fine manual bunu söylemek etti: exec_prepared için

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

Ve yine:

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

Teşekkürler! Bu hile yaptı! Doh, bunu nasıl özledim bilmiyorum! – iphone007

+0

İfadeyi yürütmeden önce hazırlamak için ne zaman buna değer? –

+1

@Martin: Aynı ifadeyi farklı değerler ile birkaç kez çalıştırmak isterseniz. Bazı DB arabirimleri, yer tutucuları kullanmak için açıkça hazırlanmış bir deyim kullanımı gerektirir, ancak 'pg' gem, yer tutucuları [exec'] ile kullanmanızı sağlar (http://rubydoc.info/gems/pg/PG/Connection#exec-instance_method) . –