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 }