class ActiveRecord::ConnectionAdapters::PostgreSQLAdapter

def translate_exception(exception, message:, sql:, binds:)

def translate_exception(exception, message:, sql:, binds:)
  return exception unless exception.respond_to?(:result)
  case exception.result.try(:error_field, PG::PG_DIAG_SQLSTATE)
  when nil
    if exception.message.match?(/connection is closed/i)
      ConnectionNotEstablished.new(exception)
    else
      super
    end
  when UNIQUE_VIOLATION
    RecordNotUnique.new(message, sql: sql, binds: binds)
  when FOREIGN_KEY_VIOLATION
    InvalidForeignKey.new(message, sql: sql, binds: binds)
  when VALUE_LIMIT_VIOLATION
    ValueTooLong.new(message, sql: sql, binds: binds)
  when NUMERIC_VALUE_OUT_OF_RANGE
    RangeError.new(message, sql: sql, binds: binds)
  when NOT_NULL_VIOLATION
    NotNullViolation.new(message, sql: sql, binds: binds)
  when SERIALIZATION_FAILURE
    SerializationFailure.new(message, sql: sql, binds: binds)
  when DEADLOCK_DETECTED
    Deadlocked.new(message, sql: sql, binds: binds)
  when DUPLICATE_DATABASE
    DatabaseAlreadyExists.new(message, sql: sql, binds: binds)
  when LOCK_NOT_AVAILABLE
    LockWaitTimeout.new(message, sql: sql, binds: binds)
  when QUERY_CANCELED
    QueryCanceled.new(message, sql: sql, binds: binds)
  else
    super
  end
end