Advertisement
Guest User

Untitled

a guest
Mar 19th, 2019
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.99 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "database/sql"
  5. "encoding/json"
  6. "log"
  7. "reflect"
  8. "time"
  9.  
  10. sf "github.com/snowflakedb/gosnowflake"
  11.  
  12. "fmt"
  13. )
  14.  
  15. var (
  16. sfClient *sql.DB
  17. )
  18.  
  19. type Config struct {
  20. Account string
  21. Region string
  22. Warehouse string
  23. Database string
  24. Username string
  25. Password string
  26. }
  27.  
  28. func NewSnowflakeConnection(config Config) *sql.DB {
  29.  
  30. configStr, err := sf.DSN(&sf.Config{
  31. Region: config.Region,
  32. Account: config.Account,
  33. User: config.Username,
  34. Password: config.Password,
  35. Database: config.Database,
  36. Warehouse: config.Warehouse,
  37. LoginTimeout: 5 * time.Second,
  38. })
  39.  
  40. if err != nil {
  41. log.Fatal(err)
  42. }
  43.  
  44. db, err := sql.Open("snowflake", configStr)
  45.  
  46. if err != nil {
  47. log.Fatal(err)
  48. }
  49.  
  50. return db
  51. }
  52.  
  53. func ResultsToJSON(rows *sql.Rows) ([]byte, error) {
  54.  
  55. var objects []map[string]interface{}
  56.  
  57. for rows.Next() {
  58.  
  59. columns, err := rows.ColumnTypes()
  60. if err != nil {
  61. return nil, err
  62. }
  63.  
  64. // Scan needs an array of pointers to the values it is setting
  65. // This creates the object and sets the values correctly
  66. values := make([]interface{}, len(columns))
  67. object := map[string]interface{}{}
  68. for i, column := range columns {
  69. object[column.Name()] = reflect.New(column.ScanType()).Interface()
  70. values[i] = object[column.Name()]
  71. }
  72.  
  73. err = rows.Scan(values...)
  74. if err != nil {
  75. return nil, err
  76. }
  77.  
  78. objects = append(objects, object)
  79. }
  80.  
  81. return json.Marshal(objects)
  82. }
  83.  
  84. func main() {
  85. sfClient = NewSnowflakeConnection(Config{
  86. Account: "account_name",
  87. Region: "us-east-1",
  88. Username: "user",
  89. Password: "password",
  90. Database: "databots",
  91. Warehouse: "demo_warehouse",
  92. })
  93. defer sfClient.Close()
  94.  
  95. err := sfClient.Ping()
  96. if err != nil {
  97. log.Fatal("Snowflake Connection not available")
  98. return
  99. }
  100.  
  101. rows, err := sfClient.Query("select * from TABLE_NM limit 10")
  102. defer rows.Close()
  103.  
  104. if err != nil {
  105. log.Fatal("ERROR: %s.", err)
  106. }
  107.  
  108. b, err := ResultsToJSON(rows)
  109. if err != nil {
  110. log.Fatal("ERROR: %s.", err)
  111. }
  112.  
  113. fmt.Println(string(b))
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement