2016-12-27 10 views
1

私はPGを通じて、簡単な文でエラーを取得していますがconn.exec_params:ルビーPGは、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の文字列リテラルは、引用符を使用します。二重引用符は、識別子(表名や列名など)を表します。したがって、"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'] 
) 

リテラルあなたのSQL文字列を%q{...}'...'からの切り替え内部引用の問題になります少し扱いやすくなりました。