Как получить доступ к информации об ошибках базы данных при использовании Rails и Postgres - PullRequest
5 голосов
/ 21 января 2012

Я использую find_by_sql для подключения к базе данных Postgres и выполнения функции базы данных.Функция базы данных выполняет ряд операторов SQL и вызывает требуемые исключения.

Как перехватить код ошибки и сообщение об ошибке, выданные функцией Postgres в Rails?

def self.validate_email(systemuserid, emailaddress)
  begin
    result = (self.find_by_sql(["SELECT fn_systemuser_validate_email(?, ?) AS returncode", 
                                systemuserid, emailaddress])).first
  rescue => err
    # I want to get access to the error code and error message here and act accordingly
    # errno = ??
    # errmsg = ??
    if errno == 10000
    end
  end
  return result[:returncode]
end

Я началпытаясь найти эту информацию в объекте соединения - не такая удача.

Любая помощь очень ценится.

Ответы [ 4 ]

3 голосов
/ 28 марта 2012

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

Так что единственное решение прямо сейчас - это обезьяна патч;)

module ActiveRecord
  module ConnectionAdapters
    class AbstractAdapter
      def translate_exception(e, message)
        ActiveRecord::WrappedDatabaseException.new(message,e)
      end

      # Replaces
      # def translate_exception(e, message)
      #   # override in derived class
      #   ActiveRecord::StatementInvalid.new(message)
      # end
    end
  end
end

Теперь вы можете получить оригинальное исключение.

def self.validate_email(systemuserid, emailaddress)
  begin 
    result = (self.find_by_sql(["SELECT fn_systemuser_validate_email(?, ?) AS returncode", systemuserid, emailaddress])).first
  rescue ActiveRecord::WrappedDatabaseException => e

    pgerror = e.original_exception

    # Exact api depends on PG version, check the docs for your version.
    puts "Doing my stuff: #{pgerror.result.result_error_message}"

  end
end

Это работает с pg версии 0.11 и Rails 3.0.9. Вероятно, будет работать с более поздними версиями.

0 голосов
/ 21 января 2016

Просто посмотрите на .cause.

begin
  # whatever.
rescue => err
  p err.cause
end
0 голосов
/ 10 ноября 2012

Я позволил этому пройти некоторое время, (9 месяцев!), Но поднял его снова из-за нового импульса.

Я использовал патч обезьяны, предложенный Дарвином (извините, что запрос на получение не получилголосование), а затем обнаружили, что код, который мне нужен (со ссылкой на http://deveiate.org/code/pg/PG/Result.html), выглядит следующим образом:

rescue ActiveRecord::WrappedDatabaseException => e

  pgerror = e.original_exception
  sqlstate = pgerror.result.error_field(PG::Result::PG_DIAG_SQLSTATE )
end
0 голосов
/ 21 января 2012

Вы можете использовать массив ошибок вашей модели, как и другие базы данных:

errmsg = YourModel.errors [0] .full_messages

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...