2016-12-27 30 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字符串字面量使得内部引用问题比较容易处理。