gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:29:32 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com