簡體   English   中英

調試 PG::InFailedSqlTransaction

[英]Debug PG::InFailedSqlTransaction

一些背景

PG::InFailedSqlTransaction在某些 PG 異常被搶救並阻止事務回滾時出現。 簡單的例子:

ActiveRecord::Base.transaction do
  ActiveRecord::Base.connection.execute('SELECT nothing FROM nowhere') rescue nil
  binding.pry # <- let's assume we're here
  User.count # raises PG::InFailedSqlTransaction
end

事務中的第一行靜默地中斷事務並繼續,第一行之后的任何 SQL 語句都會引發PG::InFailedSqlTransaction: ERROR: current transaction is aborted, commands ignored until end of transaction block

問題

假設我們在上面的binding.pry斷點上,有沒有辦法調試它並獲取初始異常或任何其他數據?
不太清楚它是如何在后台實現的,但 PG 似乎很有可能緩存一些關於錯誤的元數據。

編輯:上面的代碼只是一個演示一般問題的示例,問題是當我們無法輕易找到挽救異常的地方時如何獲取錯誤

根據@engineersmnky 的評論,可以使用#error_message方法從PG::Connection實例中獲取最后一條錯誤消息,該實例可以從ActiveRecord 連接中獲取: ActiveRecord::Base.connection.raw_connection.error_message

如果我們從問題示例中的 pry 斷點運行上述命令,它將返回以下消息:

ERROR:  relation "nowhere" does not exist
LINE 1: SELECT nothing FROM nowhere
                            ^

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM