Documentation ¶
Overview ¶
Package gosnowflake is a pure Go Snowflake driver for the database/sql package.
Clients can use the database/sql package directly. For example:
import ( "database/sql" _ "github.com/snowflakedb/gosnowflake" ) func main() { db, err := sql.Open("snowflake", "user:password@myaccount/mydb") if err != nil { log.Fatal(err) } defer db.Close() ... }
Connection String ¶
Use Open to create a database handle with connection parameters:
db, err := sql.Open("snowflake", "<connection string>")
The Go Snowflake Driver supports the following connection syntaxes (or data source name formats):
- username[:password]@accountname/dbname/schemaname[?param1=value&...¶mN=valueN
- username[:password]@accountname/dbname[?param1=value&...¶mN=valueN
- username[:password]@hostname:port/dbname/schemaname?account=<your_account>[¶m1=value&...¶mN=valueN]
The following example opens a database handle with the Snowflake account myaccount where the username is jsmith, password is mypassword, database is mydb, schema is testschema, and warehouse is mywh:
db, err := sql.Open("snowflake", "jsmith:mypassword@myaccount/mydb/testschema?warehouse=mywh")
Connection Parameters ¶
The following connection parameters are supported:
region <string>: Specifies the Snowflake region. By default, the US West region is used. US East region, specify us-east-1. EU (Frankfurt) region, specify eu-central-1. AU (Australia) region, specify ap-southeast-2.
account <string>: Specifies the name of your Snowflake account, where string is the name assigned to your account by Snowflake. In the URL you received from Snowflake, your account name is the first segment in the domain (e.g. abc123 in https://abc123.snowflakecomputing.com). This parameter is optional if your account is specified after the @ character.
database: Specifies the database to use by default in the client session (can be changed after login).
schema: Specifies the database schema to use by default in the client session (can be changed after login).
warehouse: Specifies the virtual warehouse to use by default for queries, loading, etc. in the client session (can be changed after login).
role: Specifies the role to use by default for accessing Snowflake objects in the client session (can be changed after login).
passcode: Specifies the passcode provided by Duo when using MFA for login.
passcodeInPassword: false by default. Set to true if the MFA passcode is embedded in the login password. Appends the MFA passcode to the end of the password.
loginTimeout: Specifies the timeout, in seconds, for login. The default is 60 seconds. The login request gives up after the timeout length if the HTTP response is success.
authenticator: Specifies the authenticator to use for authenticating user credentials:
To use the internal Snowflake authenticator, specify snowflake (Default).
To authenticate through Okta, specify https://<okta_account_name>.okta.com (URL prefix for Okta).
application: Identifies your application to Snowflake Support.
insecureMode false by default. Set to true to bypass the Offensive Security Certified Professional (OSCP) certificate revocation check. IMPORTANT: Change the default value for testing or emergency situations only.
*proxyHost: Specifies the host name for the proxy server. The proxy must be accessible via the URL http://proxyHost:proxyPort/. The proxyUser and proxyPassword parameters are optional. Note that SSL proxy configuration is not supported.
proxyPort: Specifies the port number for the proxy server.
proxyUser: Specifies the name of the user used to connect to the proxy server.
proxyPassword: Specifies the password for the user account used to connect to the proxy server.
Logging ¶
By default, the driver's builtin logger is NOP; no output is generated. This is intentional for those applications that use the same set of logger parameters not to conflict with glog, which is incorporated in the driver logging framework.
In order to enable debug logging for the driver, add a build tag sfdebug to the go tool command lines, for example:
go build -tags=sfdebug
For tests, run the test command with the tag along with glog parameters. For example, the following command will generate all acitivty logs in the standard error.
go test -tags=sfdebug -v . -vmodule=*=2 -stderrthreshold=INFO
Likewise, if you build your application with the tag, you may specify the same set of glog parameters.
your_go_program -vmodule=*=2 -stderrthreshold=INFO
To get the logs for a specific module, use the -vmodule option. For example, to retrieve the driver.go and connection.go module logs:
your_go_program -vmodule=driver=2,connection=2 -stderrthreshold=INFO
Note: If your request retrieves no logs, call db.Close() or glog.flush() to flush the glog buffer.
Note: The logger may be changed in the future for better logging. Currently if the applications use the same parameters as glog, you cannot collect both application and driver logs at the same time.
Canceling Query by CtrlC ¶
From 0.5.0, a signal handling responsibility has moved to the applications. If you want to cancel a query/command by Ctrl+C, add a os.Interrupt trap in context to execute methods that can take the context parameter, e.g., QueryContext, ExecContext.
// handle interrupt signal ctx, cancel := context.WithCancel(context.Background()) c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt) defer func() { signal.Stop(c) }() go func() { <-c log.Println("Caught signal, canceling...") cancel() }() ... (connection) // execute a query rows, err := db.QueryContext(ctx, query) ... (Ctrl+C to cancel the query)
See cmd/selectmany.go for the full example.
Supported Data Types ¶
Queries return SQL column type information in the ColumnType type. The DatabaseTypeName method returns the following strings representing Snowflake data types:
String Representation Snowflake Data Type FIXED NUMBER/INT REAL REAL TEXT VARCHAR/STRING DATE DATE TIME TIME TIMESTAMP_LTZ TIMESTAMP_LTZ TIMESTAMP_NTZ TIMESTAMP_NTZ TIMESTAMP_TZ TIMESTAMP_TZ VARIANT VARIANT OBJECT OBJECT ARRAY ARRAY BINARY BINARY BOOLEAN BOOLEAN
Binding Time Type ¶
Go's database/sql package limits Go's data types to the following for binding and fetching:
int64 float64 bool []byte string time.Time
Fetching data isn't an issue since the database data type is provided along with the data so the Go Snowflake Driver can translate Snowflake data types to Go native data types.
When the client binds data to send to the server, however, the driver cannot determine the date/timestamp data types to associate with binding parameters. For example:
dbt.mustExec("CREATE OR REPLACE TABLE tztest (id int, ntz, timestamp_ntz, ltz timestamp_ltz)") // ... stmt, err :=dbt.db.Prepare("INSERT INTO tztest(id,ntz,ltz) VALUES(1, ?, ?)") // ... tmValue time.Now() // ... Is tmValue a TIMESTAMP_NTZ or TIMESTAMP_LTZ? _, err = stmt.Exec(tmValue, tmValue)
To resolve this issue, a binding parameter flag is introduced that associates any subsequent time.Time type to the DATE, TIME, TIMESTAMP_LTZ, TIMESTAMP_NTZ or BINARY data type. The above example could be rewritten as follows:
import ( sf "github.com/snowflakedb/gosnowflake" ) dbt.mustExec("CREATE OR REPLACE TABLE tztest (id int, ntz, timestamp_ntz, ltz timestamp_ltz)") // ... stmt, err :=dbt.db.Prepare("INSERT INTO tztest(id,ntz,ltz) VALUES(1, ?, ?)") // ... tmValue time.Now() // ... _, err = stmt.Exec(sf.DataTypeTimestampNtz, tmValue, sf.DataTypeTimestampLtz, tmValue)
Timestamps with Time Zones ¶
The driver fetches TIMESTAMP_TZ (timestamp with time zone) data using the offset-based Location types, which represent a collection of time offsets in use in a geographical area, such as CET (Central European Time) or UTC (Coordinated Universal Time). The offset-based Location data is generated and cached when a Go Snowflake Driver application starts, and if the given offset is not in the cache, it is generated dynamically.
Currently, Snowflake doesn't support the name-based Location types, e.g., America/Los_Angeles.
For more information about Location types, see the Go documentation for https://golang.org/pkg/time/#Location.
Binary Data ¶
Internally, this feature leverages the []byte data type. As a result, BINARY data cannot be bound without the binding parameter flag. In the following example, sf is an alias for the gosnowflake package:
var b = []byte{0x01, 0x02, 0x03} _, err = stmt.Exec(sf.DataTypeBinary, b)
Limitations ¶
Currently, GET and PUT operations are unsupported.
Index ¶
Constants ¶
const ( // ErrCodeEmptyAccountCode is an error code for the case where a DNS doesn't include account parameter ErrCodeEmptyAccountCode = 260000 // ErrCodeEmptyUsernameCode is an error code for the case where a DNS doesn't include user parameter ErrCodeEmptyUsernameCode // ErrCodeEmptyPasswordCode is an error code for the case where a DNS doesn't include password parameter ErrCodeEmptyPasswordCode // ErrCodeFailedToParseHost is an error code for the case where a DNS includes an invalid host name ErrCodeFailedToParseHost // ErrCodeFailedToParsePort is an error code for the case where a DNS includes an invalid port number ErrCodeFailedToParsePort // ErrCodeIdpConnectionError is an error code for the case where a IDP connection failed ErrCodeIdpConnectionError // ErrCodeSSOURLNotMatch is an error code for the case where a SSO URL doesn't match ErrCodeSSOURLNotMatch ErrServiceUnavailable // ErrFailedToConnect is an error code for the case where a DB connection failed due to wrong account name ErrFailedToConnect // ErrFailedToPostQuery is an error code for the case where HTTP POST failed. ErrFailedToPostQuery = 261000 // ErrFailedToRenewSession is an error code for the case where session renewal failed. ErrFailedToRenewSession // ErrFailedToCancelQuery is an error code for the case where cancel query failed. ErrFailedToCancelQuery // ErrFailedToCloseSession is an error code for the case where close session failed. ErrFailedToCloseSession // ErrFailedToAuth is an error code for the case where authentication failed for unknown reason. ErrFailedToAuth // ErrFailedToAuthSAML is an error code for the case where authentication via SAML failed for unknown reason. ErrFailedToAuthSAML // ErrFailedToAuthOKTA is an error code for the case where authentication via OKTA failed for unknown reason. ErrFailedToAuthOKTA // ErrFailedToGetSSO is an error code for the case where authentication via OKTA failed for unknown reason. ErrFailedToGetSSO // ErrFailedToGetChunk is an error code for the case where it failed to get chunk of result set ErrFailedToGetChunk = 262001 // ErrNoReadOnlyTransaction is an error code for the case where readonly mode is specified. ErrNoReadOnlyTransaction = 263001 // ErrNoDefaultTransactionIsolationLevel is an error code for the case where non default isolation level is specified. ErrNoDefaultTransactionIsolationLevel // ErrInvalidTimestampTz is an error code for the case where a returned TIMESTAMP_TZ internal value is invalid ErrInvalidTimestampTz = 268001 // ErrInvalidOffsetStr is an error code for the case where a offset string is invalid. The input string must // consist of sHHMI where one sign character '+'/'-' followed by zero filled hours and minutes ErrInvalidOffsetStr // ErrInvalidBinaryHexForm is an error code for the case where a binary data in hex form is invalid. ErrInvalidBinaryHexForm )
const ( // SQLStateNumericValueOutOfRange is a SQL State code indicating Numeric value is out of range. SQLStateNumericValueOutOfRange = "22003" // SQLStateInvalidDataTimeFormat is a SQL State code indicating DataTime format is invalid. SQLStateInvalidDataTimeFormat = "22007" // SQLStateConnectionWasNotEstablished is a SQL State code indicating connection was not established. SQLStateConnectionWasNotEstablished = "08001" // SQLStateConnectionRejected is a SQL State code indicating connection was rejected. SQLStateConnectionRejected = "08004" // SQLStateConnectionFailure is a SQL State code indicating connection failed. SQLStateConnectionFailure = "08006" // SQLStateFeatureNotSupported is a SQL State code indicating the feature is not enabled. SQLStateFeatureNotSupported = "0A000" )
const SnowflakeGoDriverVersion = "0.5.0"
SnowflakeGoDriverVersion is the version of Go Snowflake Driver.
Variables ¶
var ( // DataTypeFixed is a FIXED datatype. DataTypeFixed = []byte{fixedType} // DataTypeReal is a REAL datatype. DataTypeReal = []byte{realType} // DataTypeText is a TEXT datatype. DataTypeText = []byte{textType} // DataTypeDate is a Date datatype. DataTypeDate = []byte{dateType} // DataTypeVariant is a TEXT datatype. DataTypeVariant = []byte{variantType} // DataTypeTimestampLtz is a TIMESTAMP_LTZ datatype. DataTypeTimestampLtz = []byte{timestampLtzType} // DataTypeTimestampNtz is a TIMESTAMP_NTZ datatype. DataTypeTimestampNtz = []byte{timestampNtzType} // DataTypeTimestampTz is a TIMESTAMP_TZ datatype. DataTypeTimestampTz = []byte{timestampTzType} // DataTypeObject is a OBJECT datatype. DataTypeObject = []byte{objectType} // DataTypeArray is a ARRAY datatype. DataTypeArray = []byte{arrayType} // DataTypeBinary is a BINARY datatype. DataTypeBinary = []byte{binaryType} // DataTypeTime is a TIME datatype. DataTypeTime = []byte{timeType} // DataTypeBoolean is a BOOLEAN datatype. DataTypeBoolean = []byte{booleanType} )
var ( // ErrEmptyAccount is returned if a DNS doesn't include account parameter. ErrEmptyAccount = &SnowflakeError{ Number: ErrCodeEmptyAccountCode, Message: "account is empty", } // ErrEmptyUsername is returned if a DNS doesn't include user parameter. ErrEmptyUsername = &SnowflakeError{ Number: ErrCodeEmptyUsernameCode, Message: "user is empty", } // ErrEmptyPassword is returned if a DNS doesn't include password parameter. ErrEmptyPassword = &SnowflakeError{ Number: ErrCodeEmptyPasswordCode, Message: "password is empty"} )
var SnowflakeTransport = &http.Transport{ TLSClientConfig: &tls.Config{ RootCAs: certPool, VerifyPeerCertificate: verifyPeerCertificateParallel, }, MaxIdleConns: 10, IdleConnTimeout: 30 * time.Minute, }
SnowflakeTransport includes the certificate revocation check with OCSP in parallel. By default, the driver uses this transport object.
var SnowflakeTransportSerial = &http.Transport{ TLSClientConfig: &tls.Config{ RootCAs: certPool, VerifyPeerCertificate: verifyPeerCertificateSerial, }, MaxIdleConns: 10, IdleConnTimeout: 30 * time.Minute, }
SnowflakeTransportSerial includes the certificate revocation check with OCSP in serial.
var SnowflakeTransportTest = SnowflakeTransport
SnowflakeTransportTest includes the certificate revocation check in parallel
Functions ¶
Types ¶
type Config ¶
type Config struct { Account string // Account name User string // Username Password string // Password (requires User) Database string // Database name Schema string // Schema Warehouse string // Warehouse Role string // Role Region string // Region Params map[string]*string // other connection parameters Protocol string // http or https (optional) Host string // hostname (optional) Port int // port (optional) Authenticator string // snowflake or okta Passcode string PasscodeInPassword bool LoginTimeout time.Duration // Login timeout RequestTimeout time.Duration // request timeout Application string // application name. InsecureMode bool // driver doesn't check certificate revocation status }
Config is a set of configuration parameters
type SnowflakeError ¶
type SnowflakeError struct { Number int SQLState string QueryID string Message string MessageArgs []interface{} IncludeQueryID bool // TODO: populate this in connection }
SnowflakeError is a error type including various Snowflake specific information.
func (*SnowflakeError) Error ¶
func (se *SnowflakeError) Error() string
Source Files ¶
Directories ¶
Path | Synopsis |
---|---|
cmd
|
|
select1
Example: Fetch one row.
|
Example: Fetch one row. |
selectmany
Example: Fetch many rows and allow cancel the query by Ctrl+C.
|
Example: Fetch many rows and allow cancel the query by Ctrl+C. |
verifycert
Example: Verify SSL/TLS certificate with OCSP revocation check
|
Example: Verify SSL/TLS certificate with OCSP revocation check |