2013-01-21 98 views
0
我以前使用的sqlite3我的Ruby代碼

工作,它的工作罰款下面的代碼修改Ruby代碼PostgreSQL的

def existsCheck(db, id) 
    temp = db.exec('SELECT 1 WHERE EXISTS(
     SELECT 1 
     FROM Products 
     WHERE promoID = ? 
    ) ', [id]).length > 0 
end 


def writeDB(db, product) 
    db.exec('INSERT INTO Products (promoID, name, price, shipping, condition, grade, included, not_included, image, time_added) 
         VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', [product.promoID, product.name, product.price, product.shipping, product.condition, product.grade, product.included, product.notIncluded, product.image, product.time]) 
end 

PostgreSQL可以不支持「的想法?」還是我做錯了什麼?

+1

不要直接寫一個數據庫的寶石/驅動器,而不是使用像[續](HTTP的ORM://續集.rubyforge.org /)。特別是閱讀[Cheat Sheet](http://sequel.rubyforge.org/rdoc/files/doc/cheat_sheet_rdoc.html)。 Sequel在PostgreSQL上工作得非常好;作者是DBM的忠實粉絲。使用ORM的好處在於,您不必爲數據庫編寫特定的SQL,而是讓ORM執行此操作。 –

回答

0

fine PG::Connection manual

- (PG::Result) exec(sql[, params, result_format ])
- (Object) exec(sql[, params, result_format ]) {|pg_result| ... }
[...]
PostgreSQL的綁定參數被表示爲$1$1$2等,SQL查詢的內部。 params數組的第0個元素綁定到$1,第1個元素綁定到$2等。nil被視爲NULL

所以要使用編號的佔位符PostgreSQL的:

def existsCheck(db, id) 
    temp = db.exec('SELECT 1 WHERE EXISTS(
     SELECT 1 
     FROM Products 
     WHERE promoID = $1 
    ) ', [id]).to_a.length > 0 
    # You'll also need to .to_a the result before you can 
    # treat it as an array... 
end 
+0

也許'選擇1從產品哪裏promoID = $ 1 LIMIT 1'會更好。而不是奇怪的'SELECT 1 WHERE EXISTS ...' –

+0

@Igor:我認爲它是更常見的'select exists(select 1 from ...)'構造的變體,其中,AFAIK,一些數據庫有特殊的優化。 –

+0

'SELECT EXIST(...)'和'SELECT 1 ... LIMIT 1'在PostgreSQL中佔用相同的時間。但是'SELECT ... LIMIT 1'更容易編寫和理解。然而,如果項目用於多個數據庫,則「SELECT EXIST」可能是相關的。 –