github.com/snowflakedb/gosnowflake@v1.9.0/cmd/selectmany/selectmany.go (about) 1 // Example: Fetch many rows and allow cancel the query by Ctrl+C. 2 package main 3 4 import ( 5 "context" 6 "database/sql" 7 "flag" 8 "fmt" 9 "log" 10 "os" 11 "os/signal" 12 "runtime/debug" 13 "runtime/pprof" 14 15 sf "github.com/snowflakedb/gosnowflake" 16 ) 17 18 var ( 19 cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file") 20 memprofile = flag.String("memprofile", "", "write memory profile to this file") 21 ) 22 23 // run is an actual main 24 func run(dsn string) { 25 // handler interrupt signal 26 ctx, cancel := context.WithCancel(context.Background()) 27 c := make(chan os.Signal, 1) 28 defer close(c) 29 signal.Notify(c, os.Interrupt) 30 defer func() { 31 signal.Stop(c) 32 }() 33 go func() { 34 select { 35 case <-c: 36 cancel() 37 case <-ctx.Done(): 38 } 39 }() 40 41 db, err := sql.Open("snowflake", dsn) 42 if err != nil { 43 log.Fatalf("failed to connect. err: %v", err) 44 } 45 defer db.Close() 46 query := `select * from 47 (select 0 a union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) A, 48 (select 0 b union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) B, 49 (select 0 c union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) C, 50 (select 0 d union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) E, 51 (select 0 e union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) F, 52 (select 0 f union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) G, 53 (select 0 f union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) H` 54 fmt.Printf("Executing a query. It may take long. You may stop by Ctrl+C.\n") 55 rows, err := db.QueryContext(ctx, query) 56 if err != nil { 57 log.Fatalf("failed to run a query. %v, err: %v", query, err) 58 } 59 defer rows.Close() 60 var v1, v2, v3, v4, v5, v6, v7 int 61 fmt.Printf("Fetching the results. It may take long. You may stop by Ctrl+C.\n") 62 counter := 0 63 for rows.Next() { 64 if err = rows.Scan(&v1, &v2, &v3, &v4, &v5, &v6, &v7); err != nil { 65 log.Fatalf("failed to get result. err: %v", err) 66 } 67 if counter%10000 == 0 { 68 fmt.Printf("data: %v, %v, %v, %v, %v, %v, %v\n", v1, v2, v3, v4, v5, v6, v7) 69 } 70 if counter%1000000 == 0 { 71 debug.FreeOSMemory() 72 } 73 counter++ 74 } 75 if rows.Err() != nil { 76 fmt.Printf("ERROR: %v\n", rows.Err()) 77 return 78 } 79 fmt.Printf("Congrats! You have successfully run %v with Snowflake DB!\n", query) 80 } 81 82 func main() { 83 if !flag.Parsed() { 84 flag.Parse() 85 } 86 87 cfg, err := sf.GetConfigFromEnv([]*sf.ConfigParam{ 88 {Name: "Account", EnvName: "SNOWFLAKE_TEST_ACCOUNT", FailOnMissing: true}, 89 {Name: "User", EnvName: "SNOWFLAKE_TEST_USER", FailOnMissing: true}, 90 {Name: "Password", EnvName: "SNOWFLAKE_TEST_PASSWORD", FailOnMissing: true}, 91 {Name: "Host", EnvName: "SNOWFLAKE_TEST_HOST", FailOnMissing: false}, 92 {Name: "Port", EnvName: "SNOWFLAKE_TEST_PORT", FailOnMissing: false}, 93 {Name: "Protocol", EnvName: "SNOWFLAKE_TEST_PROTOCOL", FailOnMissing: false}, 94 }) 95 if err != nil { 96 log.Fatalf("failed to create Config, err: %v", err) 97 } 98 dsn, err := sf.DSN(cfg) 99 if err != nil { 100 log.Fatalf("failed to create DSN from Config: %v, err: %v", cfg, err) 101 } 102 103 if *cpuprofile != "" { 104 f, err := os.Create(*cpuprofile) 105 if err != nil { 106 log.Fatal(err) 107 } 108 pprof.StartCPUProfile(f) 109 defer pprof.StopCPUProfile() 110 } 111 112 run(dsn) 113 114 if *memprofile != "" { 115 f, err := os.Create(*memprofile) 116 if err != nil { 117 log.Fatal(err) 118 } 119 pprof.WriteHeapProfile(f) 120 f.Close() 121 return 122 } 123 }