Postgres странный PG::Неопределенный столбец: ОШИБКА: при значении

#ruby-on-rails #ruby #postgresql #activerecord

Вопрос:

При выполнении простой операции выбора места с помощью activerecord выполните,

 ActiveRecord::Base.connection.execute('select * from spree_variants where sku = "1SB-E4196-00";')
 

Я получил эту ошибку:

 from /Users/abc/.rvm/gems/ruby-2.7.2@cboparts/gems/activerecord-6.0.3.5/lib/active_record/connection_adapters/postgresql/database_statements.rb:92:in `exec'
Caused by PG::UndefinedColumn: ERROR:  column "1SB-E4196-00" does not exist
LINE 1: select * from spree_variants where sku = "1SB-E4196-00";
 

Почему он рассматривается "1SB-E4196-00" как столбец, а не артикул? Ошибка кажется вводящей в заблуждение.

Ответ №1:

Потому что PostgreSQL ожидает, что строки будут заключены в одинарные кавычки. В то время как двойные кавычки имеют другое значение:

Существует второй тип идентификатора: идентификатор с разделителями или идентификатор в кавычках. Он формируется путем заключения произвольной последовательности символов в двойные кавычки («). Идентификатор с разделителями-это всегда идентификатор, а не ключевое слово.

Это означает, что если следующий запрос должен работать:

 ActiveRecord::Base.connection.execute(
  "select * from spree_variants where sku = '1SB-E4196-00';"
)
 

Кстати, если вы используете Rails и у SpreeVariant вас есть модель, вы можете увидеть в консоли, как Rails форматирует и экранирует запрос следующим образом:

 puts SpreeVariant.where(sku: '1SB-E4196-00').to_sql