![](/img/trans.png)
[英]ActiveRecord::StatementInvalid: 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.