ruby-on-rails - 使用 Rails 和 Postgres 时如何访问数据库错误信息

标签 ruby-on-rails postgresql model error-handling

我正在使用 find_by_sql 连接到 Postgres 数据库并执行数据库函数。数据库函数执行大量 SQL 语句并根据需要引发异常。

如何捕获 Rails 中 Postgres 函数引发的错误代码和错误消息?

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

我开始尝试在连接对象中查找此信息 - 运气不佳。

非常感谢任何帮助。

最佳答案

当前事件记录用内部错误替换原始错误,而不用新错误传递原始错误。我不明白为什么会有人想要这个。

所以现在唯一的解决办法是猴子补丁;)

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

现在你可以获得original_exception。

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。可能会与更高版本一起使用。

关于ruby-on-rails - 使用 Rails 和 Postgres 时如何访问数据库错误信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8952189/

相关文章:

ruby-on-rails - ActiveRecord - 如果没有 child 离开,则销毁 parent

ruby-on-rails - 不会为 Heroku 设置 Figaro 环境变量

postgresql - 从 Postgres 的 JSONB 字段中选择不为空的值

postgresql - Heroku 评论应用程序 : copy DB to review app

ruby-on-rails-3 - Rails 3 - 如何保存(取消)选中的复选框?

c# - 遍历模型属性并在代码文件中获取值

ruby-on-rails - Rails 迁移不添加 id 列

PostgreSQL 抛出错误 : "ERROR: permission denied for relation table_name"

Qt 模型的 TreeView 和表格 View

ruby-on-rails - 警告 : toplevel constant referenced