2016-12-27 69 views
1

我通過PG得到一個簡單的語句中的錯誤:紅寶石PG conn.exec_params SQL結構

require 'pg' 
conn = PG.connect(dbname: 'myDB') 
@res = conn.exec_params('SELECT count(id) FROM users WHERE username = $1 AND status = "active"', ['johnny5']) 

錯誤:

/Users/rich/app.rb:14:in `exec_params': ERROR: column "active" does not exist (PG::UndefinedColumn) 
LINE 1: ...unt(id) FROM users WHERE username = $1 AND status = "active" 
                  ^

「活動」 是一個字段值,而不是柱。

我的問題:我通過輸入值「active」作爲另一個佔位符來解決這個問題。 SQL中的引用值不允許嗎?我認爲SQL的引用方面會很好。

回答

2

SQL中的字符串文字使用sigle引號,雙引號用於標識符(如表和列名稱)。所以,當你提到"active"時,數據庫會抱怨沒有這樣的列。

的解決方案是使用一個佔位符:

@res = conn.exec_params(
    %q{SELECT count(id) FROM users WHERE username = $1 AND status = $2}, 
    ['johnny5', 'active'] 
) 

或使用SQL裏面單引號:

@res = conn.exec_params(
    %q{SELECT count(id) FROM users WHERE username = $1 AND status = 'active'}, 
    ['johnny5'] 
) 

'...'切換到%q{...}您的SQL字符串字面量使得內部引用問題比較容易處理。