In this installment, I am going to walk through the process of connecting GO to the Snowflake Data Warehouse Service (DWaaS). This tutorial requires that you have a Snowflake account. You can sign up here for a 30 day/$400.00 trial.
Download and Install the ODBC Driver
Once you have your account set up in Snowflake, follow the directions to download the ODBC Driver. It will the same place you find the snowSQL download:
Installing GO
Installing GO can be accomplished via Homebrew or visiting the GoLang download page. If you chose Homebrew, can find installation instructions on their page, or you can copy and paste:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
which will get you going right away. Once you get Homebrew going, you can simply type:
Macbook Pro:~ dbryant$ brew install go
Confirm GO is installed:
Macbook Pro:~ dbryant$ go version go version go1.10.1 darwin/amd64
After you install GO, this would be a good time to update you .profile to include a GOPATH environment variable. For my configuration, it looks like this:
$ cat .bash_profile export PS1="$ " export GOPATH=/Users/dbryant/go $ echo $GOPATH /Users/dbryant/go
Install dep
dep is a prototype dependency management tool for Go. It requires Go 1.9 or newer to compile. Since Homebrew is already on your machine, we can easily install dep using brew:
$ brew install dep Updating Homebrew... ==> Auto-updated Homebrew! Updated 1 tap (homebrew/core). ==> New Formulae amtk ==> Updated Formulae annie git-quick-stats nvc ansiweather giter8 ola apache-flink gitlab-runner overmind babel gnome-latex packer bareos-client grpc paket bazel harfbuzz proxychains-ng binaryen jpeg-archive pulseaudio byteman kube-aws sane-backends ccextractor latex2rtf sipp charm lensfun snakemake cmake libdvbpsi sphinx-doc cockroach libfixbuf tepl collectd libtorrent-rasterbar tiger-vnc conjure-up liquibase traefik fakeroot mpop util-linux fastqc mutt vala file-roller neomutt webpack fn net-snmp webtorrent-cli folly nifi weechat fwup npth xonsh ==> Installing dependencies for dep: go ==> Installing dep dependency: go ==> Downloading https://homebrew.bintray.com/bottles/go-1.10.3.high_sierra.bottl ######################################################################## 100.0% ==> Pouring go-1.10.3.high_sierra.bottle.tar.gz ==> Caveats A valid GOPATH is required to use the `go get` command. If $GOPATH is not specified, $HOME/go will be used by default: https://golang.org/doc/code.html#GOPATH You may wish to add the GOROOT-based install location to your PATH: export PATH=$PATH:/usr/local/opt/go/libexec/bin ==> Summary ? /usr/local/Cellar/go/1.10.3: 8,170 files, 336.7MB ==> Installing dep ==> Downloading https://homebrew.bintray.com/bottles/dep-0.4.1_1.high_sierra.bot ######################################################################## 100.0% ==> Pouring dep-0.4.1_1.high_sierra.bottle.tar.gz ? /usr/local/Cellar/dep/0.4.1_1: 7 files, 8.8MB ==> Caveats ==> go A valid GOPATH is required to use the `go get` command. If $GOPATH is not specified, $HOME/go will be used by default: https://golang.org/doc/code.html#GOPATH You may wish to add the GOROOT-based install location to your PATH: export PATH=$PATH:/usr/local/opt/go/libexec/bin
Install the GO Snowflake Driver:
Get Gosnowflake source code and dep (dependency managment tool), if not installed, and ensure the dependent libraries are installed.
go get -u github.com/snowflakedb/gosnowflake go get -u github.com/golang/dep/cmd/dep cd $GOPATH/src/github.com/snowflakedb/gosnowflake/ dep ensure
Now that we have most of the prerequisites for the connection done, we need to build the sample programs
$ make install for c in $(ls cmd); do \ (cd cmd/$c; GOBIN=$GOPATH/bin go install $c.go); \ done $
After executing the make install command, I found our test file “select1.go” in the following subdirectory:
/Users/dbryant/go/src/github.com/snowflakedb/gosnowflake/cmd/select1/
If you have all of your path information configured correctly, this should be okay for you test a connection. This test program will simply attempt to connect to the Snowflake data warehouse. There are three parameters required for connecting to Snowflake via GO and the select1.go test file.
Let’s take a look at the snippet from the select1.go file
... // getDSN constructs a DSN based on the test connection parameters func getDSN() (string, *sf.Config, error) { env := func(k string, failOnMissing bool) string { if value := os.Getenv(k); value != "" { return value } if failOnMissing { log.Fatalf("%v environment variable is not set.", k) } return "" } account := env("SNOWFLAKE_TEST_ACCOUNT", true) user := env("SNOWFLAKE_TEST_USER", true) password := env("SNOWFLAKE_TEST_PASSWORD", true) host := env("SNOWFLAKE_TEST_HOST", false) port := env("SNOWFLAKE_TEST_PORT", false) protocol := env("SNOWFLAKE_TEST_PROTOCOL", false) portStr, _ := strconv.Atoi(port) cfg := &sf.Config{ Account: account, User: user, Password: password, Host: host, Port: portStr, Protocol: protocol, } dsn, err := sf.DSN(cfg) return dsn, cfg, err } ...
The function above comes from the select1.go test file. You should notice that the env function for account, user, and password pass a true parameter. These are values read from your O/S environment variables. I created a shell script to set these values for testing purposes.
$ cat .sfgo.sh #!/bin/sh export SNOWFLAKE_TEST_ACCOUNT=my_account_name export SNOWFLAKE_TEST_USER=user_name export SNOWFLAKE_TEST_PASSWORD=password $ $ chmod 755 .sfgo.sh $ . .sfgo.sh
Once you have run the script, check that your environment variables are set:
$ echo $SNOWFLAKE_TEST_USER user_name $ echo $SNOWFLAKE_TEST_ACCOUNT my_account_name $ echo $SNOWFLAKE_TEST_PASSWORD password $
After verifying these environment variables have been set correctly, confirm that you are in the directory with the select1.go file and execute the following:
$ go run select1.go Congrats! You have successfully run SELECT 1 with Snowflake DB!
If you see the Congrats! message, then congratulations, you have successfully connect to the Snowflake Data Warehouse Cloud Service.
Enjoy!