2016-12-27 17 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 используют сиглые кавычки, двойные кавычки для идентификаторов (например, имена таблиц и столбцов). Итак, когда вы указываете "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 строкового литерала делает внутренние цитирование ПРОБЛЕМ бит легче справиться.