package main import ( "database/sql" "flag" "fmt" "log" "strings" _ "github.com/mattn/go-sqlite3" ) func main() { dbpath := flag.String("db", "./db.db", "path to db file") q := flag.String("q", "show tables", "query to execute") flag.Parse() db, err := sql.Open("sqlite3", *dbpath) if err != nil { panic(err) } query := strings.Trim(strings.TrimSpace(*q), ";") + ";" if strings.HasPrefix(strings.ToUpper(strings.TrimSpace(query)), "SELECT") { rows, err := db.Query(query) if err != nil { panic(err) } defer rows.Close() columns, err := rows.Columns() if err != nil { panic(err) } ptrs := make([]any, len(columns)) for i := range ptrs { var v interface{} ptrs[i] = &v } for rows.Next() { if err := rows.Scan(ptrs...); err != nil { panic(err) } for i := range ptrs { ptr := ptrs[i].(*interface{}) columns[i] = fmt.Sprint(*ptr) } log.Println(columns) } } else { stmt, err := db.Prepare(query) if err != nil { panic(err) } result, err := stmt.Exec() if err != nil { panic(err) } affected, err := result.RowsAffected() log.Printf("%d: %v", affected, err) } }