Приложение Синатра на Heroku ActiveRecord :: StatementInvalid: PGError: ОШИБКА: - PullRequest
2 голосов
/ 08 января 2012

СЦЕНАРИЙ:
В настоящее время у меня есть приложение на Heroku, это Sinatra Application + ActiveRecord. Что в данный момент работает:
• Я могу просматривать статические страницы моего сайта
• Я могу запустить миграцию
• Я могу передать свою локальную базу данных разработки в свою базу данных Heroku (heroku db: push postgres: // localhost / dev)
• Я могу вытащить из базы данных Heroku вниз к моей локальной базе данных (heroku db: pull postgres: // localhost / dev)

ОШИБКА:
Когда я перехожу на страницу, которая делает простой запрос вроде:

@ pics = Picture.find (: все)

Я получаю эту ошибку в моем лог-файле

DEBUG -- : NoMethodError: undefined method `values' for #<PGresult:0x00000002844098>: SHOW client_min_messages  
DEBUG -- : PGError: ERROR:  invalid value for parameter "client_min_messages": ""  
: SET client_min_messages TO ''  
ActiveRecord::StatementInvalid - PGError: ERROR:  invalid value for parameter "client_min_messages": ""  
/app/.bundle/gems/ruby/1.9.1/gems/activerecord-3.1.3/lib/active_record/connection_adapters/postgresql_adapter.rb:592:in `async_exec'  

На данный момент я не уверен, что не так, поэтому я решил войти на heroku console и запустить эту команду, чтобы проверить, есть ли мои таблицы в БД

> heroku console
> ActiveRecord::Base.connection.tables 

И я получаю похожие ошибки

ActiveRecord::StatementInvalid: PGError: ERROR:  invalid value for parameter "client_min_messages": ""  
: SET client_min_messages TO ''  
    /app/.bundle/gems/ruby/1.9.1/gems/activerecord-3.1.3/lib/active_record/connection_adapters/postgresql_adapter.rb:592:in `async_exec'  
    /app/.bundle/gems/ruby/1.9.1/gems/activerecord-3.1.3/lib/active_record/connection_adapters/postgresql_adapter.rb:592:in `block in execute'  
    /app/.bundle/gems/ruby/1.9.1/gems/activerecord-3.1.3/lib/active_record/connection_adapters/abstract_adapter.rb:244:in `block in log'  
    /app/.bundle/gems/ruby/1.9.1/gems/activesupport-3.1.3/lib/active_support/notifications/instrumenter.rb:21:in `instrument'  

Тогда я решил попробовать это в консоли ...

> ActiveRecord::Base.establish_connection

> ActiveRecord::AdapterNotSpecified: ActiveRecord::AdapterNotSpecified    
/app/.bundle/gems/ruby/1.9.1/gems/activerecord-3.1.3/lib/active_record/connection_adapters/abstract/connection_specification.rb:54:in `establish_connection'    
/home/heroku_rack/lib/console.rb:158:in `block (2 levels) in <top (required)>'  
/home/heroku_rack/lib/console.rb:148:in `eval'  
/home/heroku_rack/lib/console.rb:148:in `_eval' 

В этот момент может показаться, что у меня нет таблиц и подключения адаптера, но как это может быть, когда я могу выполнить миграцию, а также перенести и вытащить из базы данных Heroku?


ОБНОВЛЕНИЕ 1 - НЕ БОЛЬШЕ, НО БОЛЬШЕ ПРОСМОТРА

Поэтому я решил начать с нуля и повторить это снова. Кажется, я добился определенного прогресса, но я застрял. При перезапуске моего сценария я упоминал выше и добился успеха. Итак, моя база данных, миграция и данные находятся в БД. Но мое приложение все еще не может подключиться к БД. Но что странно, так это мое консольное взаимодействие.

> heroku console

> ActiveRecord::Base.connection_config 
> {:adapter=>"postgresql", :database=>"1e2e12e21e", :username=>"1e2e12e21e", :password=>"i2j3i23joo12", :host=>"1e2-12e-2e1212-e2e2e1.compute-1.amazonaws.com", :port=>5432, :encoding=>"unicode"}

ПРИМЕЧАНИЕ: я заменил реальные детали на эти фальшивые вещи только для иллюстрации

> ActiveRecord::Base.connection_handler  
> #<ActiveRecord::ConnectionAdapters::ConnectionHandler:0x00000002f8a578 @connection_pools={"….

ПРИМЕЧАНИЕ. Это действительно длинная строка, но она имеет содержание

> ActiveRecord::Base.connected?
> false

На данный момент я действительно не понимаю? Я не понимаю, как я могу продолжать выполнять миграцию БД, сохранять данные и извлекать данные, входить в консоль Heroku, чтобы посмотреть мои connection_config данные, НО, когда я запускаю внутреннюю ошибку сервера моего приложения. И когда я запускаю ActiveRecord::Base.connection.tables в heroku console, я получаю ActiveRecord::StatementInvalid: PGError: ERROR: invalid value for parameter "client_min_messages": ""

Есть мысли о том, что я могу делать неправильно?

ФИНАЛЬНОЕ ОБНОВЛЕНИЕ

Вот в чем проблема: Поддержка Heroku любезно указала мне на известную проблему с activerecord 3.1.3. Это ошибка, которая должна быть исправлена ​​в будущих обновлениях: https://github.com/rails/rails/commit/92a3c487bb0d125c437e53a7f45c31fcca97f2d9

Как решить проблему: Я решил использовать намного более низкую версию activerecord в моем gemfile gem "activerecord", "~> 3.0.9, и мой сайт работает без проблем.

Почему я никогда не пробовал это, прежде чем я не знаю. Я надеюсь, что этот пост кто-нибудь еще.

Ответы [ 4 ]

2 голосов
/ 12 марта 2012

У меня была эта проблема в течение долгого времени, и это сводило меня с ума.Я не мог найти решение нигде (и многие обновления рельсов прошли мимо решения «проблемы»), поэтому я решил просто разобраться в проблеме сам.Это оказалось легко исправить.Просто добавьте дополнительный ключ, пара значений: :min_messages => "warn" (или любой другой уровень сообщения, который вы хотите) в настройку ActiveRecord в вашем блоке конфигурации.вот что я сейчас использую в своем приложении Sinatra, используя Sinatra 1.3.2 и ActiveRecord 3.2.2:

db = URI.parse(ENV['DATABASE_URL'] || "postgres://user:password@localhost/database")
adapter = (db.scheme == "postres") ? "postgresql" : db.scheme
ActiveRecord::Base.configurations[:production] = { 
    :adapter  => adapter,
    :username => db.user,
    :password => db.password,
    :port     => db.port,
    :database => db.path.sub(%r(^/),""),
    :host     => db.host,
    :min_messages => "warn"
}
unless ActiveRecord::Base.connected?
    ActiveRecord::Base.establish_connection ActiveRecord::Base.configurations[:production]
    ActiveRecord::Base.logger = Logger.new(STDOUT)
end

надеюсь, это поможет вам и другим людям, имеющим эти проблемы!

1 голос
/ 09 мая 2012

У меня была эта проблема на стеках бамбука-ри-1.8.7 и бамбука-мри-1.9.2. Приложение отлично работало на localhost и перенесло OK на heroku, но чтение базы данных в веб-стеке heroku не удалось с жалобой client_min_messages.

Установка: min_messages (как предложено в другом ответе) либо на «предупреждение», либо на «предупреждение» приводила к различным ошибкам.

Принудительное использование ActiveRecord до версии 3.0.11 (с версии 3.2.3) решило проблему. (Не то чтобы я видел что-то в AR, чтобы объяснить это. Я предполагаю, что это связано с различными версиями postgres ... Я использую 9.0.3, подозреваю, что общий доступ к героку бамбука составляет 8.4)

1 голос
/ 23 апреля 2012

Ни одно из других предложений не сработало для меня. В конечном итоге я исправил это, переключившись на кедровую стопку Heroku:

Герою создай свое приложение - стек кедра

0 голосов
/ 24 июня 2013

Нажав на это в моем гем-файле, у меня получилось.

group :production do 
  gem 'pg'
  gem 'activerecord', '~> 3.0.9'
end
...