github.com/rudderlabs/rudder-go-kit@v0.30.0/sqlutil/printrows.go (about)

     1  package sqlutil
     2  
     3  import (
     4  	"database/sql"
     5  	"fmt"
     6  	"io"
     7  	"text/tabwriter"
     8  )
     9  
    10  // PrintRowsToTable prints the rows to the output in a table format.
    11  func PrintRowsToTable(rows *sql.Rows, output io.Writer) error {
    12  	w := tabwriter.NewWriter(output, 0, 0, 1, ' ', tabwriter.AlignRight|tabwriter.Debug)
    13  	// Get column names
    14  	columns, err := rows.Columns()
    15  	if err != nil {
    16  		return fmt.Errorf("getting column names: %w", err)
    17  	}
    18  
    19  	for _, column := range columns {
    20  		fmt.Fprint(w, "\t"+column)
    21  	}
    22  	fmt.Fprintln(w, "\t")
    23  	for range columns {
    24  		fmt.Fprint(w, "\t---")
    25  	}
    26  	fmt.Fprintln(w, "\t")
    27  
    28  	values := make([]any, len(columns))
    29  	scanArgs := make([]any, len(values))
    30  	for i := range values {
    31  		scanArgs[i] = &values[i]
    32  	}
    33  
    34  	for rows.Next() {
    35  		err = rows.Scan(scanArgs...)
    36  		if err != nil {
    37  			return fmt.Errorf("scanning row: %w", err)
    38  		}
    39  		for _, value := range values {
    40  			switch value := value.(type) {
    41  			case nil:
    42  				fmt.Fprint(w, "\tNULL")
    43  			case []byte:
    44  				fmt.Fprint(w, "\t"+string(value))
    45  			default:
    46  				fmt.Fprintf(w, "\t%v", value)
    47  			}
    48  		}
    49  		fmt.Fprintln(w, "\t")
    50  	}
    51  	w.Flush()
    52  	return rows.Err()
    53  }