Driver do Databricks SQL para Go

O Driver do Databricks SQL para Go é a biblioteca do Go que permite usar código Go para executar comandos SQL em recursos de computação do Azure Databricks. Este artigo complementa o LEIAME, a referência de API e os exemplos do Driver SQL do Databricks para Go.

Requisitos

Introdução ao Driver do Databricks SQL para Go

  1. Em seu computador de desenvolvimento com o Go 1.20 ou superior já instalado e um projeto de código Go existente já criado, crie um arquivo go.mod para rastrear as dependências do seu código Go executando o comando go mod init, por exemplo:

    go mod init sample
    
  2. Crie uma dependência no pacote Driver do SQL do Databricks para Go executando o comando go mod edit -require, substituindo v1.5.2 pela versão mais recente do pacote Driver do SQL do Databricks para Go, conforme listado em Versões:

    go mod edit -require github.com/databricks/databricks-sql-go@v1.5.2
    

    Seu arquivo go.mod agora deve ser assim:

    module sample
    
    go 1.20
    
    require github.com/databricks/databricks-sql-go v1.5.2
    
  3. Em seu projeto, crie um arquivo de código Go que importe o Driver do SQL do Databricks para Go. O exemplo a seguir, em um arquivo nomeado main.go com o conteúdo a seguir, lista todos os clusters no seu espaço de trabalho do Azure Databricks:

    package main
    
    import (
      "database/sql"
      "os"
      _ "github.com/databricks/databricks-sql-go"
    )
    
    func main() {
      dsn := os.Getenv("DATABRICKS_DSN")
    
      if dsn == "" {
        panic("No connection string found. " +
         "Set the DATABRICKS_DSN environment variable, and try again.")
      }
    
      db, err := sql.Open("databricks", dsn)
      if err != nil {
        panic(err)
      }
      defer db.Close()
    
      if err := db.Ping(); err != nil {
        panic(err)
      }
    }
    
  4. Adicione as dependências de módulo ausentes executando o comando go mod tidy:

    go mod tidy
    

    Observação

    Se receber o erro go: warning: "all" matched no packages, você esqueceu de adicionar um arquivo de código Go que importa o Driver do SQL do Databricks para Go.

  5. Faça cópias de todos os pacotes necessários para dar suporte a compilações e testes de pacotes em seu módulo main, executando o comando go mod vendor:

    go mod vendor
    
  6. Modifique seu código conforme necessário para definir a variável de ambiente DATABRICKS_DSN para a autenticação do Azure Databricks. Consulte também Conectar-se com uma cadeia de conexão DSN.

  7. Execute o arquivo de código Go, considerando um arquivo chamado main.go, executando o comando go run:

    go run main.go
    
  8. Se nenhum erro for retornado, você autenticou com êxito o Driver do SQL do Databricks para Go com o Workspace do Azure Databricks e se conectou ao seu cluster do Azure Databricks em execução ou ao SQL Warehouse nesse espaço de trabalho.

Conectar-se com uma cadeia de conexão DSN

Para acessar clusters e QL warehouses, use sql.Open() para criar um identificador de banco de dados por meio de uma cadeia de conexão DSN (nome da fonte de dados). Este exemplo de código recupera a cadeia de conexão DSN de uma variável de ambiente chamada DATABRICKS_DSN:

package main

import (
  "database/sql"
  "os"
  _ "github.com/databricks/databricks-sql-go"
)

func main() {
  dsn := os.Getenv("DATABRICKS_DSN")

  if dsn == "" {
    panic("No connection string found. " +
          "Set the DATABRICKS_DSN environment variable, and try again.")
  }

  db, err := sql.Open("databricks", dsn)
  if err != nil {
    panic(err)
  }
  defer db.Close()

  if err := db.Ping(); err != nil {
    panic(err)
  }
}

Para especificar a cadeia de conexão DSN no formato correto, confira os exemplos de cadeia de conexão DSN em Autenticação. Por exemplo, para a autenticação de token de acesso pessoal do Azure Databricks, use a seguinte sintaxe, na qual:

  • <personal-access-token> é o token de acesso pessoal do Azure Databricks dos requisitos.
  • <server-hostname> pelo valor do Nome do host do servidor nos requisitos.
  • <port-number> é o valor Porta dos requisitos, que normalmente é 443.
  • <http-path> é o valor do Caminho HTTP obtido nos requisitos.
  • <paramX=valueX> é um ou mais Parâmetros opcionais listados posteriormente neste artigo.
token:<personal-access-token>@<server-hostname>:<port-number>/<http-path>?<param1=value1>&<param2=value2>

Por exemplo, para um cluster:

token:dapi12345678901234567890123456789012@adb-1234567890123456.7.azuredatabricks.net:443/sql/protocolv1/o/1234567890123456/1234-567890-abcdefgh

Por exemplo, para um SQL warehouse:

token:dapi12345678901234567890123456789012@adb-1234567890123456.7.azuredatabricks.net:443/sql/1.0/endpoints/a1b234c5678901d2

Observação

Como prática recomendada de segurança, você não deve codificar essa cadeia de conexão DSN em seu código Go. Em vez disso, você deve recuperar essa cadeia de conexão DSN de um local seguro. Por exemplo, o exemplo de código anterior neste artigo usou uma variável de ambiente.

Parâmetros opcionais

  • Os parâmetros de conexão opcionais com suporte podem ser especificados em <param=value>. Alguns dos mais usados incluem:
    • catalog: define o nome inicial do catálogo na sessão.
    • schema: define o nome inicial do esquema na sessão.
    • maxRows: configura o número máximo de linhas buscadas por solicitação. O padrão é 10000.
    • timeout: adiciona o tempo limite (em segundos) para execução da consulta do servidor. O padrão é não ter um tempo limite.
    • userAgentEntry: usado para identificar parceiros. Para obter mais informações, consulte a documentação de seu parceiro.
  • Os parâmetros de sessão opcionais com suporte podem ser especificados em param=value. Alguns dos mais usados incluem:
    • ansi_mode: uma cadeia de caracteres booliana. true para instruções de sessão para seguir as regras especificadas pela especificação do SQL ANSI. O padrão do sistema é falso.
    • timezone: uma cadeia de caracteres, por exemplo, America/Los_Angeles. Define o fuso horário da sessão. O padrão do sistema é UTC.

Por exemplo, para um SQL warehouse:

token:dapi12345678901234567890123456789012@adb-1234567890123456.7.azuredatabricks.net:443/sql/1.0/endpoints/a1b234c5678901d2?catalog=hive_metastore&schema=example&maxRows=100&timeout=60&timezone=America/Sao_Paulo&ansi_mode=true

Conecte-se com a função NewConnector

Como alternativa, use sql.OpenDB() para criar um identificador de banco de dados por meio de um novo objeto de conector criado com dbsql.NewConnector() (conectar-se a clusters do Azure Databricks e SQL warehouses com um novo objeto de conector requer v1.0.0 ou superior do Driver SQL do SQL para Go). Por exemplo:

package main

import (
  "database/sql"
  "os"
  dbsql "github.com/databricks/databricks-sql-go"
)

func main() {
  connector, err := dbsql.NewConnector(
    dbsql.WithAccessToken(os.Getenv("DATABRICKS_ACCESS_TOKEN")),
    dbsql.WithServerHostname(os.Getenv("DATABRICKS_HOST")),
    dbsql.WithPort(443),
    dbsql.WithHTTPPath(os.Getenv("DATABRICKS_HTTP_PATH")),
  )
  if err != nil {
    panic(err)
  }

  db := sql.OpenDB(connector)
  defer db.Close()

  if err := db.Ping(); err != nil {
    panic(err)
  }
}

Para especificar o conjunto correto de configurações NewConnector, confira os exemplos em Autenticação.

Observação

Como melhor prática de segurança, você não deve codificar suas configurações NewConnector em seu código Go. Em vez disso, recupere esses valores de um local seguro. Por exemplo, o código anterior usa variáveis de ambiente.

Algumas das opções funcionais usadas com mais frequência incluem:

  • WithAccessToken(<access-token>): o token de acesso pessoal do Azure Databricks dos requisitos. Obrigatório string.
  • WithServerHostname(<server-hostname>): o valor do Nome do host do servidor nos requisitos. Obrigatório string.
  • WithPort(<port>): o número da porta do servidor, normalmente, 443. Obrigatório int.
  • WithHTTPPath(<http-path>): o valor do Caminho HTTP dos requisitos. Obrigatório string.
  • WithInitialNamespace(<catalog>, <schema>): o nome do esquema e do catálogo na sessão. string, string opcional.
  • WithMaxRows(<max-rows>): o número máximo de linhas buscadas por solicitação. O padrão é 10000.. Opcional int.
  • WithSessionParams(<params-map>): os parâmetros de sessão, incluindo "fuso horário" e "ansi_mode". map[string]string opcional.
  • WithTimeout(<timeout>). O tempo limite (em time.Duration) para execução da consulta do servidor. O padrão é não ter um tempo limite. Opcional.
  • WithUserAgentEntry(<isv-name-plus-product-name>). Usado para identificar parceiros. Para obter mais informações, consulte a documentação de seu parceiro. string opcional.

Por exemplo:

connector, err := dbsql.NewConnector(
  dbsql.WithAccessToken(os.Getenv("DATABRICKS_ACCESS_TOKEN")),
  dbsql.WithServerHostname(os.Getenv("DATABRICKS_HOST")),
  dbsql.WithPort(443),
  dbsql.WithHTTPPath(os.Getenv("DATABRICKS_HTTP_PATH")),
  dbsql.WithInitialNamespace("samples", "nyctaxi"),
  dbsql.WithMaxRows(100),
  dbsql.SessionParams(map[string]string{"timezone": "America/Sao_Paulo", "ansi_mode": "true"}),
  dbsql.WithTimeout(time.Minute),
  dbsql.WithUserAgentEntry("example-user"),
)

Autenticação

O Driver do SQL do Databricks para Go dá suporte para os seguintes tipos de autenticação do Azure Databricks:

O Driver SQL do Databricks para Go ainda não dá suporte para os seguintes tipos de autenticação do Azure Databricks:

Autenticação de token de acesso pessoal do Databricks

Para usar o Driver do SQL do Databricks para Go com o Azure Databricks autenticação de token de acesso pessoal, você deve primeiro criar um token de acesso pessoal do Azure Databricks, da seguinte maneira:

  1. No workspace do Azure Databricks, clique no nome de usuário do Azure Databricks na barra superior e selecione Configurações na lista suspensa.
  2. Clique em Desenvolvedor.
  3. Ao lado de Tokens de acesso, clique em Gerenciar.
  4. Clique em Gerar novo token.
  5. (Opcional) Insira um comentário que ajude você a identificar esse token no futuro e altere o tempo de vida padrão do token de 90 dias. Para criar um token sem tempo de vida (não recomendado), deixe a caixa Tempo de vida (dias) vazia (em branco).
  6. Clique em Gerar.
  7. Copie o token exibido para um local seguro e clique em Concluído.

Observação

Lembre-se de salvar o token copiado em um local seguro. Não compartilhe seu token copiado com outras pessoas. Se você perder o token copiado, não poderá regenerar exatamente aquele mesmo token. Em vez disso, será necessário repetir esse procedimento para criar um novo token. Caso você tenha perdido o token copiado ou acredite que ele tenha sido comprometido, o Databricks recomenda que você exclua imediatamente esse token do seu workspace clicando no ícone de lixeira (Revogar) ao lado do token na página de Tokens de acesso.

Se você não conseguir criar ou usar tokens em seu workspace, isso pode ocorrer porque o administrador do workspace desabilitou tokens ou não deu permissão para criar ou usar tokens. Veja o administrador do workspace ou o seguinte:

Para autenticar o Driver do Databricks SQL para Go com uma cadeia de conexão DSN e o exemplo de código em Conectar com uma cadeia de conexão DSN, use a seguinte sintaxe de cadeia de conexão DSN, na qual:

  • <personal-access-token> é o token de acesso pessoal do Azure Databricks dos requisitos.
  • <server-hostname> pelo valor do Nome do host do servidor nos requisitos.
  • <port-number> é o valor Porta dos requisitos, que normalmente é 443.
  • <http-path> é o valor do Caminho HTTP obtido nos requisitos.

Você também pode acrescentar um ou mais parâmetros Opcionais listados anteriormente neste artigo.

token:<personal-access-token>@<server-hostname>:<port-number>/<http-path>

Para autenticar o Driver do Databricks SQL para Go com a função NewConnector, use o seguinte trecho de código e o exemplo de código em Conectar com a função NewConnector, que pressupõe que você tenha definido as variáveis de ambiente a seguir:

  • DATABRICKS_SERVER_HOSTNAMEdefinido como o valor Nome do Host do Servidor do seu cluster ou SQL Warehouse.
  • DATABRICKS_HTTP_PATH, definido para o valor do Caminho HTTP para seu cluster ou SQL Warehouse.
  • DATABRICKS_TOKEN, definido como o token de acesso pessoal do Azure Databricks.

Para definir variáveis de ambiente, confira a documentação do sistema operacional.

connector, err := dbsql.NewConnector(
  dbsql.WithServerHostname(os.Getenv("DATABRICKS_SERVER_HOSTNAME")),
  dbsql.WithHTTPPath(os.Getenv("DATABRICKS_HTTP_PATH")),
  dbsql.WithPort(443),
  dbsql.WithAccessToken(os.Getenv("DATABRICKS_TOKEN")),
)

Autenticação de token do Microsoft Entra ID (antigo Azure Active Directory)

O Driver do SQL do Databricks para Go dá suporte a tokens do Microsoft Entra ID (antigo Azure Active Directory) para um usuário do Azure Databricks ou uma entidade de serviço do Microsoft Entra ID.

Para criar um token de acesso do Microsoft Entra ID, faça o seguinte:

  • Para um usuário do Azure Databricks, você pode usar a CLI do Azure. Confira Obtenha o Microsoft Entra ID (antigo Azure Active Directory) para usuários usando a CLI do Azure.

    Os tokens do Microsoft Entra ID têm um tempo de vida padrão de cerca de 1 hora. Para criar um novo token do Microsoft Entra ID, repita esse processo.

    Para autenticar o Driver do Databricks SQL para Go com uma cadeia de conexão DSN e o exemplo de código em Conectar com uma cadeia de conexão DSN, use a seguinte sintaxe de cadeia de conexão DSN, na qual:

    • <microsoft-entra-id-token> é seu token do Microsoft Entra ID.
    • <server-hostname> pelo valor do Nome do host do servidor nos requisitos.
    • <port-number> é o valor Porta dos requisitos, que normalmente é 443.
    • <http-path> é o valor do Caminho HTTP obtido nos requisitos.

    Você também pode acrescentar um ou mais parâmetros Opcionais listados anteriormente neste artigo.

    token:<microsoft-entra-id-token>@<server-hostname>:<port-number>/<http-path>
    

    Para autenticar o Driver do Databricks SQL para Go com a função NewConnector, use o seguinte trecho de código e o exemplo de código em Conectar com a função NewConnector, que pressupõe que você tenha definido as variáveis de ambiente a seguir:

    • DATABRICKS_SERVER_HOSTNAMEdefinido como o valor Nome do Host do Servidor do seu cluster ou SQL Warehouse.
    • DATABRICKS_HTTP_PATH, definido para o valor do Caminho HTTP para seu cluster ou SQL Warehouse.
    • DATABRICKS_TOKEN, definido como seu token do Microsoft Entra ID.

    Para definir variáveis de ambiente, confira a documentação do sistema operacional.

    connector, err := dbsql.NewConnector(
      dbsql.WithServerHostname(os.Getenv("DATABRICKS_SERVER_HOSTNAME")),
      dbsql.WithHTTPPath(os.Getenv("DATABRICKS_HTTP_PATH")),
      dbsql.WithPort(443),
      dbsql.WithAccessToken(os.Getenv("DATABRICKS_TOKEN")),
    )
    

Autenticação U2M (usuário para computador) do OAuth

As versões 1.5.0 e superiores do Driver do SQL do Databricks para Go dão suporte à autenticação OAuth de usuário para máquina (U2M).

Para usar o Driver do SQL do Databricks para Go com uma cadeia de conexão DSN e o exemplo de código em Conectar com uma cadeia de conexão DSN, use a seguinte sintaxe de cadeia de conexão DSN, na qual:

  • <server-hostname> pelo valor do Nome do host do servidor nos requisitos.

    • <port-number> é o valor Porta dos requisitos, que normalmente é 443.
    • <http-path> é o valor do Caminho HTTP obtido nos requisitos.

    Você também pode acrescentar um ou mais parâmetros Opcionais listados anteriormente neste artigo.

    <server-hostname>:<port-number>/<http-path>?authType=OauthU2M
    

    Para autenticar o Driver do Databricks SQL para Go com a função NewConnector, você deve primeiro adicionar o seguinte à sua declaração import:

    "github.com/databricks/databricks-sql-go/auth/oauth/u2m"
    

    Em seguida, use o seguinte trecho de código e o exemplo de código em Conectar com a função NewConnector, que pressupõe que você tenha definido as seguintes variáveis de ambiente:

    • DATABRICKS_SERVER_HOSTNAMEdefinido como o valor Nome do Host do Servidor do seu cluster ou SQL Warehouse.
    • DATABRICKS_HTTP_PATH, definido para o valor do Caminho HTTP para seu cluster ou SQL Warehouse.

    Para definir variáveis de ambiente, confira a documentação do sistema operacional.

    authenticator, err := u2m.NewAuthenticator(os.Getenv("DATABRICKS_SERVER_HOSTNAME"), 1*time.Minute)
    if err != nil {
      panic(err)
    }
    
    connector, err := dbsql.NewConnector(
      dbsql.WithServerHostname(os.Getenv("DATABRICKS_SERVER_HOSTNAME")),
      dbsql.WithHTTPPath(os.Getenv("DATABRICKS_HTTP_PATH")),
      dbsql.WithPort(443),
      dbsql.WithAuthenticator(authenticator),
    )
    

Autenticação M2M (de computador para computador) do OAuth

As versões 1.5.2 e superiores do Driver do SQL do Databricks para Go dão suporte à autenticação OAuth máquina a máquina (M2M).

Para usar o Databricks SQL Driver para Go com a autenticação OAuth M2M, siga as etapas de instalação no de autenticação M2M (máquina a máquina) do OAuth.

Para autenticar o Driver do Databricks SQL para Go com uma cadeia de conexão DSN e o exemplo de código em Conectar com uma cadeia de conexão DSN, use a seguinte sintaxe de cadeia de conexão DSN, na qual:

  • <server-hostname> pelo valor do Nome do host do servidor nos requisitos.

    • <port-number> é o valor Porta dos requisitos, que normalmente é 443.
    • <http-path> é o valor do Caminho HTTP obtido nos requisitos.
    • <client-id> é o valor da ID do aplicativo (cliente) da entidade de serviço.
    • <client-secret> é o valor do Segredo para o segredo do OAuth da entidade de serviço. (Não há suporte para segredos do Microsoft Entra ID com a autenticação OAuth M2M.)

    Você também pode acrescentar um ou mais parâmetros Opcionais listados anteriormente neste artigo.

    <server-hostname>:<port-number>/<http-path>?authType=OAuthM2M&clientID=<client-id>&clientSecret=<client-secret>
    

    Para autenticar o Driver do Databricks SQL para Go com a função NewConnector, você deve primeiro adicionar o seguinte à sua declaração import:

    "github.com/databricks/databricks-sql-go/auth/oauth/m2m"
    

    Em seguida, use o seguinte trecho de código e o exemplo de código em Conectar com a função NewConnector, que pressupõe que você tenha definido as seguintes variáveis de ambiente:

    • DATABRICKS_SERVER_HOSTNAMEdefinido como o valor Nome do Host do Servidor do seu cluster ou SQL Warehouse.
    • DATABRICKS_HTTP_PATH, definido para o valor do Caminho HTTP para seu cluster ou SQL Warehouse.
    • DATABRICKS_CLIENT_ID, definido como o valor ID do aplicativo (cliente) da entidade de serviço.
    • DATABRICKS_CLIENT_SECRET, definido como o valor do Segredo para o segredo OAuth da entidade de serviço. (Não há suporte para segredos do Microsoft Entra ID com a autenticação OAuth M2M.)

    Para definir variáveis de ambiente, confira a documentação do sistema operacional.

    authenticator := m2m.NewAuthenticator(
      os.Getenv("DATABRICKS_CLIENT_ID"),
      os.Getenv("DATABRICKS_CLIENT_SECRET"),
      os.Getenv("DATABRICKS_SERVER_HOSTNAME"),
    )
    
    connector, err := dbsql.NewConnector(
      dbsql.WithServerHostname(os.Getenv("DATABRICKS_SERVER_HOSTNAME")),
      dbsql.WithHTTPPath(os.Getenv("DATABRICKS_HTTP_PATH")),
      dbsql.WithPort(443),
      dbsql.WithAuthenticator(authenticator),
    )
    

Consultar dados

O exemplo de código a seguir demonstra como chamar o Driver de SQL do Databricks para Go para executar uma consulta SQL básica em um recurso de computação do Azure Databricks. Esse comando retorna as duas primeiras linhas da tabela trips no esquema nyctaxi do catálogo samples.

Este exemplo de código recupera a cadeia de conexão DSN de uma variável de ambiente chamada DATABRICKS_DSN.

package main

import (
  "database/sql"
  "fmt"
  "os"
  "time"

  _ "github.com/databricks/databricks-sql-go"
)

func main() {
  dsn := os.Getenv("DATABRICKS_DSN")

  if dsn == "" {
    panic("No connection string found." +
          "Set the DATABRICKS_DSN environment variable, and try again.")
  }

  db, err := sql.Open("databricks", dsn)
  if err != nil {
    panic(err)
  }

  defer db.Close()

  var (
    tpep_pickup_datetime  time.Time
    tpep_dropoff_datetime time.Time
    trip_distance         float64
    fare_amount           float64
    pickup_zip            int
    dropoff_zip           int
  )

  rows, err := db.Query("SELECT * FROM samples.nyctaxi.trips LIMIT 2")
  if err != nil {
    panic(err)
  }

  defer rows.Close()

  fmt.Print("tpep_pickup_datetime,",
    "tpep_dropoff_datetime,",
    "trip_distance,",
    "fare_amount,",
    "pickup_zip,",
    "dropoff_zip\n")

  for rows.Next() {
    err := rows.Scan(&tpep_pickup_datetime,
      &tpep_dropoff_datetime,
      &trip_distance,
      &fare_amount,
      &pickup_zip,
      &dropoff_zip)
    if err != nil {
      panic(err)
    }

    fmt.Print(tpep_pickup_datetime, ",",
      tpep_dropoff_datetime, ",",
      trip_distance, ",",
      fare_amount, ",",
      pickup_zip, ",",
      dropoff_zip, "\n")
  }

  err = rows.Err()
  if err != nil {
    panic(err)
  }
}

Saída:

tpep_pickup_datetime,tpep_dropoff_datetime,trip_distance,fare_amount,pickup_zip,dropoff_zip
2016-02-14 16:52:13 +0000 UTC,2016-02-14 17:16:04 +0000 UTC,4.94,19,10282,10171
2016-02-04 18:44:19 +0000 UTC,2016-02-04 18:46:00 +0000 UTC,0.28,3.5,10110,10110

Para obter exemplos adicionais, consulte a pasta de exemplos no repositório databricks/databricks-sql-go no GitHub.

Logging

Use github.com/databricks/databricks-sql-go/logger para registrar mensagens que o Databricks SQL Driver for Go emite. O exemplo de código a seguir usa sql.Open() para criar um identificador de banco de dados por meio de uma cadeia de conexão DSN. Este exemplo de código recupera a cadeia de conexão DSN de uma variável de ambiente chamada DATABRICKS_DSN. Todas as mensagens de log emitidas no nível debug e abaixo são gravadas no arquivo results.log.

package main

import (
  "database/sql"
  "io"
  "log"
  "os"

  _ "github.com/databricks/databricks-sql-go"
  dbsqllog "github.com/databricks/databricks-sql-go/logger"
)

func main() {
  dsn := os.Getenv("DATABRICKS_DSN")

  // Use the specified file for logging messages to.
  file, err := os.Create("results.log")
  if err != nil {
    log.Fatal(err)
  }
  defer file.Close()

  writer := io.Writer(file)

  // Log messages at the debug level and below.
  if err := dbsqllog.SetLogLevel("debug"); err != nil {
    log.Fatal(err)
  }

  // Log messages to the file.
  dbsqllog.SetLogOutput(writer)

  if dsn == "" {
    panic("Error: Cannot connect. No connection string found. " +
      "Set the DATABRICKS_DSN environment variable, and try again.")
  }

  db, err := sql.Open("databricks", dsn)
  if err != nil {
    panic(err)
  }
  defer db.Close()

  if err := db.Ping(); err != nil {
    panic(err)
  }
}

Recursos adicionais