Ruby PG conn.exec_params SQL 结构

Ruby PG conn.exec_params SQL structure

我在通过 PG 的简单语句中遇到错误:

require 'pg'
conn = PG.connect( dbname: 'myDB' )
@res = conn.exec_params( 'SELECT count(id) FROM users WHERE username =  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 =  AND status = "active"
                                                               ^

"active" 是字段值,不是列。

我的问题:我已通过输入值 "active" 作为另一个占位符来解决此问题。是否不允许在 SQL 中引用值?我认为 SQL 的引用方面会很好。

SQL 中的字符串文字使用单引号,双引号用于标识符(例如 table 和列名)。所以,当你提到 "active" 时,数据库会抱怨没有这样的列。

解决方法是使用占位符:

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

或在 SQL:

中使用单引号
@res = conn.exec_params(
  %q{SELECT count(id) FROM users WHERE username =  AND status = 'active'},
  ['johnny5']
)

将 SQL 字符串文字从 '...' 切换到 %q{...} 会使内部引用问题更容易处理。