다음을 통해 공유


Go용 Databricks SQL 드라이버

Go용 Databricks SQL 드라이버는 Go 코드를 사용하여 Azure Databricks 컴퓨팅 리소스에서 SQL 명령을 실행할 수 있는 Go 라이브러리입니다. 이 문서에서는 Go용 Databricks SQL Driver 추가 정보, API 참조예제를 보완합니다.

요구 사항

Go용 Databricks SQL 드라이버 시작

  1. Go 1.20 이상이 이미 설치되어 있고 기존 Go 코드 프로젝트가 이미 생성되어 있는 개발 컴퓨터에서 go mod init 명령을 실행하여 Go 코드의 종속성을 추적하는 go.mod 파일을 만듭니다. 예를 들면 다음과 같습니다.

    go mod init sample
    
  2. go mod edit -require 명령을 실행하여 v1.5.2릴리스에 나열된 대로 최신 버전의 Go용 Databricks SQL 드라이버 패키지로 대체하여 Go용 Databricks SQL 드라이버 패키지에 대한 종속성을 가져옵니다.

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

    이제 go.mod 파일이 다음과 비슷할 것입니다.

    module sample
    
    go 1.20
    
    require github.com/databricks/databricks-sql-go v1.5.2
    
  3. 프로젝트 내에서 Go용 Databricks SQL 드라이버를 가져오는 Go 코드 파일을 만듭니다. 다음 예제에서는 다음 내용이 포함된 main.go라는 파일에서 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. go mod tidy 명령을 실행하여 누락된 모듈 종속성을 추가합니다.

    go mod tidy
    

    참고 항목

    오류 go: warning: "all" matched no packages가 발생하면 Go용 Databricks SQL 드라이버를 가져오는 Go 코드 파일을 추가하는 것을 잊어버린 것입니다.

  5. go mod vendor 명령을 실행하여 main 모듈에서 패키지의 빌드 및 테스트를 지원하는 데 필요한 모든 패키지의 복사본을 만듭니다.

    go mod vendor
    
  6. 필요에 따라 코드를 수정하여 Azure Databricks 인증에 대한 DATABRICKS_DSN 환경 변수를 설정합니다. DSN 연결 문자열로 연결도 참조하세요.

  7. go run 명령을 실행하여 main.go라는 파일을 가정한 Go 코드 파일을 실행합니다.

    go run main.go
    
  8. 오류가 반환되지 않으면 Azure Databricks 작업 영역에서 Go용 Databricks SQL 드라이버를 성공적으로 인증하고 해당 작업 영역에서 실행 중인 Azure Databricks 클러스터 또는 SQL 웨어하우스에 연결했습니다.

DSN 연결 문자열로 연결

클러스터 및 SQL 웨어하우스에 액세스하려면 sql.Open()를 사용하여 DSN(데이터 원본 이름) 연결 문자열을 통해 데이터베이스 핸들을 만듭니다. 이 코드 예제는 DATABRICKS_DSN이라는 환경 변수에서 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)
  }
}

DSN 연결 문자열 올바른 형식으로 지정하려면 인증의 DSN 연결 문자열 예제를 참조하세요. 예를 들어 Azure Databricks 개인용 액세스 토큰 인증의 경우 다음 구문을 사용합니다.

  • <personal-access-token>은 요구 사항의 Azure Databricks 개인용 액세스 토큰입니다.
  • <server-hostname>은 요구 사항의 서버 호스트 이름 값입니다.
  • <port-number>는 요구 사항의 포트 값이며 일반적으로 443입니다.
  • <http-path>는 요구 사항의 HTTP 경로 값입니다.
  • <paramX=valueX>는 이 문서의 뒷부분에 나열된 하나 이상의 선택적 매개 변수입니다.
token:<personal-access-token>@<server-hostname>:<port-number>/<http-path>?<param1=value1>&<param2=value2>

예를 들어, 클러스터의 경우:

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

예를 들어, SQL 웨어하우스의 경우:

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

참고 항목

보안 모범 사례로 Go 코드에 이 DSN 연결 문자열을 하드 코딩하면 안 됩니다. 대신 보안 위치에서 이 DSN 연결 문자열을 검색해야 합니다. 예를 들어, 이 문서의 앞부분에 있는 코드 예제에서는 환경 변수를 사용했습니다.

선택적 매개 변수

  • 지원되는 선택적 연결 매개 변수는 <param=value>에서 지정할 수 있습니다. 더 자주 사용되는 것 중 일부는 다음과 같습니다.
    • catalog: 세션의 초기 카탈로그 이름을 설정합니다.
    • schema: 세션의 초기 스키마 이름을 설정합니다.
    • maxRows: 요청당 가져온 최대 행 수를 설정합니다. 기본값은 10000입니다.
    • timeout: 서버 쿼리 실행에 대한 시간 제한(초)을 추가합니다. 기본값은 제한 시간 없음입니다.
    • userAgentEntry: 파트너를 식별하는 데 사용됩니다. 자세한 내용은 파트너 설명서를 참조하세요.
  • 지원되는 선택적 세션 매개 변수는 param=value에서 지정할 수 있습니다. 더 자주 사용되는 것 중 일부는 다음과 같습니다.
    • ansi_mode: 부울 문자열. true 세션 문이 ANSI SQL 사양에 지정된 규칙을 준수하도록 합니다. 시스템 기본값은 false입니다.
    • timezone: 문자열(예: America/Los_Angeles). 세션의 표준 시간대를 설정합니다. 시스템 기본값은 UTC입니다.

예를 들어, SQL 웨어하우스의 경우:

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

NewConnector함수를 사용하여 연결

또는 sql.OpenDB()를 사용하여 dbsql.NewConnector()로 만든 새 커넥터 개체를 통해 데이터베이스 핸들을 만듭니다(새 커넥터 개체를 사용하여 Azure Databricks 클러스터 및 SQL 웨어하우스에 연결하려면 Go용 Databricks SQL Driver의 v1.0.0 이상이 필요합니다). 예시:

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)
  }
}

올바른 NewConnector 설정 집합을 지정하려면 인증의 예제를 참조하세요.

참고 항목

보안 모범 사례로 NewConnector 설정을 Go 코드에 하드 코딩해서는 안 됩니다. 대신 보안 위치에서 이러한 값을 검색해야 합니다. 예를 들어, 앞의 코드는 환경 변수를 사용합니다.

자주 사용되는 기능 옵션 중 일부는 다음과 같습니다.

  • WithAccessToken(<access-token>): 요구 사항의 Azure Databricks 개인용 액세스 토큰입니다. 요구되는 string.
  • WithServerHostname(<server-hostname>): 요구 사항의 서버 호스트 이름 값입니다. 요구되는 string.
  • WithPort(<port>): 서버의 포트 번호(일반적으로 443)입니다. 요구되는 int.
  • WithHTTPPath(<http-path>): 요구 사항의 HTTP 경로 값입니다. 요구되는 string.
  • WithInitialNamespace(<catalog>, <schema>):세션의 카탈로그 및 스키마 이름입니다. 선택적 string, string입니다.
  • WithMaxRows(<max-rows>): 요청당 가져온 최대 행 수입니다. 기본값은 10000.이고 선택적으로 int입니다.
  • WithSessionParams(<params-map>): "표준 시간대" 및 "ansi_mode"를 포함한 세션 매개 변수입니다. 선택적 map[string]string입니다.
  • WithTimeout(<timeout>). 서버 쿼리 실행에 대한 시간 제한(time.Duration의)입니다. 기본값은 제한 시간 없음입니다. 선택 사항.
  • WithUserAgentEntry(<isv-name-plus-product-name>). 파트너를 식별하는 데 사용됩니다. 자세한 내용은 파트너 설명서를 참조하세요. 선택적 string입니다.

예시:

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"),
)

인증

Go용 Databricks SQL 드라이버는 다음과 같은 Azure Databricks 인증 유형을 지원합니다.

Go용 Databricks SQL 드라이버는 다음과 같은 Azure Databricks 인증 유형은 아직 지원하지 않습니다.

Databricks 개인용 액세스 토큰 인증

Azure Databricks 개인용 액세스 토큰 인증과 함께 Databricks SQL Driver for Go를 사용하려면 먼저 Azure Databricks 개인용 액세스 토큰을 만들어야 합니다. 이 단계에 대한 자세한 내용은 작업 영역 사용자에 대한 Azure Databricks 개인용 액세스 토큰을 참조 하세요.

DSN 연결 문자열 사용하여 Go용 Databricks SQL 드라이버를 인증하고 DSN 연결 문자열 연결의 코드 예제를 인증하려면 다음 DSN 연결 문자열 구문을 사용합니다.

  • <personal-access-token>은 요구 사항의 Azure Databricks 개인용 액세스 토큰입니다.
  • <server-hostname>은 요구 사항의 서버 호스트 이름 값입니다.
  • <port-number>는 요구 사항의 포트 값이며 일반적으로 443입니다.
  • <http-path>는 요구 사항의 HTTP 경로 값입니다.

이 문서의 앞에 나열된 하나 이상의 선택적 매개 변수 를 추가할 수도 있습니다.

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

NewConnector 함수를 사용하여 Go용 Databricks SQL 드라이버를 인증하려면 다음 코드 조각과 NewConnector 함수를 사용하여 연결의 코드 예제를 사용하며, 이는 다음 환경 변수를 설정한 것으로 가정합니다.

  • DATABRICKS_SERVER_HOSTNAME클러스터 또는 SQL 웨어하우스의 서버 호스트 이름 값으로 설정합니다.
  • DATABRICKS_HTTP_PATH, 클러스터 또는 SQL 웨어하우스의 HTTP 경로 값으로 설정합니다.
  • DATABRICKS_TOKEN, Azure Databricks 개인용 액세스 토큰으로 설정.

환경 변수를 설정하려면 운영 체제 설명서를 참조하세요.

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")),
)

Microsoft Entra ID 토큰 인증

Go용 Databricks SQL 드라이버는 Azure Databricks 사용자 또는 Microsoft Entra ID 서비스 주체에 대한 Microsoft Entra ID 토큰을 지원합니다.

Microsoft Entra ID 액세스 토큰을 만들려면 다음을 수행합니다:

  • Azure Databricks 사용자의 경우 Azure CLI를 사용할 수 있습니다. Azure CLI를 사용하여 사용자를 위한 Microsoft Entra ID 토큰 받기를 참조하세요.

    Microsoft Entra ID 토큰의 기본 수명은 약 1시간입니다. 새 Microsoft Entra ID 토큰을 만들려면 이 프로세스를 반복합니다.

    DSN 연결 문자열 사용하여 Go용 Databricks SQL 드라이버를 인증하고 DSN 연결 문자열 연결의 코드 예제를 인증하려면 다음 DSN 연결 문자열 구문을 사용합니다.

    • <microsoft-entra-id-token>은 Microsoft Entra ID 토큰입니다.
    • <server-hostname>은 요구 사항의 서버 호스트 이름 값입니다.
    • <port-number>는 요구 사항의 포트 값이며 일반적으로 443입니다.
    • <http-path>는 요구 사항의 HTTP 경로 값입니다.

    이 문서의 앞에 나열된 하나 이상의 선택적 매개 변수 를 추가할 수도 있습니다.

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

    NewConnector 함수를 사용하여 Go용 Databricks SQL 드라이버를 인증하려면 다음 코드 조각과 NewConnector 함수를 사용하여 연결의 코드 예제를 사용하며, 이는 다음 환경 변수를 설정한 것으로 가정합니다.

    • DATABRICKS_SERVER_HOSTNAME클러스터 또는 SQL 웨어하우스의 서버 호스트 이름 값으로 설정합니다.
    • DATABRICKS_HTTP_PATH, 클러스터 또는 SQL 웨어하우스의 HTTP 경로 값으로 설정합니다.
    • DATABRICKS_TOKEN, Microsoft Entra ID 토큰으로 설정.

    환경 변수를 설정하려면 운영 체제 설명서를 참조하세요.

    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")),
    )
    

OAuth 사용자 대 컴퓨터(U2M) 인증

Go 1.5.0 이상 버전용 Databricks SQL 드라이버는 OAuth U2M(사용자 대 컴퓨터) 인증을 지원합니다.

DSN 연결 문자열 및 DSN 연결 문자열 연결의 코드 예제와 함께 Go용 Databricks SQL 드라이버를 사용하려면 다음 DSN 연결 문자열 구문을 사용합니다.

  • <server-hostname>은 요구 사항의 서버 호스트 이름 값입니다.
  • <port-number>는 요구 사항의 포트 값이며 일반적으로 443입니다.
  • <http-path>는 요구 사항의 HTTP 경로 값입니다.

이 문서의 앞에 나열된 하나 이상의 선택적 매개 변수 를 추가할 수도 있습니다.

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

NewConnector 함수를 사용하여 Go용 Databricks SQL 드라이버를 인증하려면 먼저 import 선언에 다음을 추가해야 합니다.

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

그러고는 다음의 코드 조각과 NewConnector 함수를 사용하여 연결의 코드 예제를 사용하며, 이는 다음 환경 변수를 설정한 것으로 가정합니다.

  • DATABRICKS_SERVER_HOSTNAME클러스터 또는 SQL 웨어하우스의 서버 호스트 이름 값으로 설정합니다.
  • DATABRICKS_HTTP_PATH, 클러스터 또는 SQL 웨어하우스의 HTTP 경로 값으로 설정합니다.

환경 변수를 설정하려면 운영 체제 설명서를 참조하세요.

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),
)

OAuth M2M(machine-to-machine) 인증

Go 1.5.2 이상 버전용 Databricks SQL 드라이버는 OAuth M2M(컴퓨터 대 컴퓨터) 인증을 지원합니다.

OAuth M2M 인증과 함께 Go용 Databricks SQL 드라이버를 사용하려면 다음을 수행해야 합니다.

  1. Azure Databricks 작업 영역에서 Azure Databricks 서비스 주체를 만들고 해당 서비스 주체에 대한 OAuth 비밀을 만듭니다.

    서비스 주체 및 해당 OAuth 비밀을 만들려면 OAuth(OAuth M2M)를 사용하여 서비스 주체로 Azure Databricks에 액세스 인증을 참조하세요. 서비스 주체의 UUID 또는 응용 프로그램 ID 값과 서비스 주체의 OAuth 비밀에 대한 비밀 값을 기록해 둡니다.

  2. 해당 서비스 주체에게 클러스터 또는 웨어하우스에 대한 액세스 권한을 부여합니다.

    서비스 주체에게 클러스터 또는 웨어하우스에 대한 액세스 권한을 부여하려면 컴퓨팅 사용 권한 또는 SQL 웨어하우스 관리를 참조하세요.

DSN 연결 문자열 사용하여 Go용 Databricks SQL 드라이버를 인증하고 DSN 연결 문자열 연결의 코드 예제를 인증하려면 다음 DSN 연결 문자열 구문을 사용합니다.

  • <server-hostname>은 요구 사항의 서버 호스트 이름 값입니다.
  • <port-number>는 요구 사항의 포트 값이며 일반적으로 443입니다.
  • <http-path>는 요구 사항의 HTTP 경로 값입니다.
  • <client-id>는 서비스 주체의 UUID 또는 애플리케이션 ID 값입니다.
  • <client-secret>는 서비스 주체의 OAuth 비밀에 대한 비밀 값입니다.

이 문서의 앞에 나열된 하나 이상의 선택적 매개 변수 를 추가할 수도 있습니다.

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

NewConnector 함수를 사용하여 Go용 Databricks SQL 드라이버를 인증하려면 먼저 import 선언에 다음을 추가해야 합니다.

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

그러고는 다음의 코드 조각과 NewConnector 함수를 사용하여 연결의 코드 예제를 사용하며, 이는 다음 환경 변수를 설정한 것으로 가정합니다.

  • DATABRICKS_SERVER_HOSTNAME클러스터 또는 SQL 웨어하우스의 서버 호스트 이름 값으로 설정합니다.
  • DATABRICKS_HTTP_PATH, 클러스터 또는 SQL 웨어하우스의 HTTP 경로 값으로 설정합니다.
  • DATABRICKS_CLIENT_ID, 서비스 주체의 UUID 또는 애플리케이션 ID 값으로 설정.
  • DATABRICKS_CLIENT_SECRET, Azure Databricks 서비스 주체의 OAuth 비밀 값으로 설정합니다.

환경 변수를 설정하려면 운영 체제 설명서를 참조하세요.

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),
)

쿼리 데이터

다음 코드 예제에서는 Go용 Databricks SQL 드라이버를 호출하여 Azure Databricks 컴퓨팅 리소스에서 기본 SQL 쿼리를 실행하는 방법을 보여 줍니다. 이 명령은samples 카탈로그의 nyctaxi 스키마에 있는 trips 테이블에서 처음 두 행을 반환합니다.

이 코드 예제는 DATABRICKS_DSN이라는 환경 변수에서 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)
  }
}

Unity 카탈로그 볼륨의 파일 관리

Databricks SQL 드라이버를 사용하면 다음 예제와 같이 Unity 카탈로그 볼륨에 로컬 파일을 작성하고, 볼륨에서 파일을 다운로드하고, 볼륨에서 파일을 삭제할 수 있습니다.

package main

import (
  "context"
  "database/sql"
  "os"

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

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()

  // For writing local files to volumes and downloading files from volumes,
  // you must first specify the path to the local folder that contains the
  // files to be written or downloaded.
  // For multiple folders, add their paths to the following string array.
  // For deleting files in volumes, this string array is ignored but must
  // still be provided, so in that case its value can be set for example
  // to an empty string.
  ctx := driverctx.NewContextWithStagingInfo(
    context.Background(),
    []string{"/tmp/"},
  )

  // Write a local file to the path in the specified volume.
  // Specify OVERWRITE to overwrite any existing file in that path.
  db.ExecContext(ctx, "PUT '/tmp/my-data.csv' INTO '/Volumes/main/default/my-volume/my-data.csv' OVERWRITE")

  // Download a file from the path in the specified volume.
  db.ExecContext(ctx, "GET '/Volumes/main/default/my-volume/my-data.csv' TO '/tmp/my-downloaded-data.csv'")

  // Delete a file from the path in the specified volume.
  db.ExecContext(ctx, "REMOVE '/Volumes/main/default/my-volume/my-data.csv'")

  db.Close()
}

로깅

github.com/databricks/databricks-sql-go/logger를 사용하여 Go용 Databricks SQL 드라이버에서 내보내는 메시지를 기록합니다. 다음 코드 예제에서는 sql.Open()을 사용하여 DSN 연결 문자열을 통해 데이터베이스 핸들을 만듭니다. 이 코드 예제는 DATABRICKS_DSN이라는 환경 변수에서 DSN 연결 문자열을 검색합니다. debug 수준 이하에서 내보내는 모든 로그 메시지는 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)
  }
}

테스트

코드를 테스트하려면 테스트 표준 라이브러리와 같은 Go 테스트 프레임워크를 사용합니다. Azure Databricks REST API 엔드포인트를 호출하지 않거나 Azure Databricks 계정 또는 작업 영역의 상태를 변경하지 않고 시뮬레이션된 조건에서 코드를 테스트하려면 testfify와 같은 Go 모의 라이브러리를 사용합니다.

예를 들어 Azure Databricks 작업 영역 연결을 반환하는 GetDBWithDSNPAT 함수, samples 카탈로그 nyctaxi 스키마의 trips 테이블에서 데이터를 반환하는 GetNYCTaxiTrips 함수 및 반환된 데이터를 출력하는 PrintNYCTaxiTrips를 포함하는 helpers.go라는 이름의 다음 파일을 가정합니다.

package main

import (
  "database/sql"
  "fmt"
  "strconv"
  "time"
)

func GetDBWithDSNPAT(dsn string) (*sql.DB, error) {
  db, err := sql.Open("databricks", dsn)
  if err != nil {
    return nil, err
  }
  return db, nil
}

func GetNYCTaxiTrips(db *sql.DB, numRows int) (*sql.Rows, error) {
  rows, err := db.Query("SELECT * FROM samples.nyctaxi.trips LIMIT " + strconv.Itoa(numRows))
  if err != nil {
    return nil, err
  }
  return rows, nil
}

func PrintNYCTaxiTrips(rows *sql.Rows) {
  var (
    tpep_pickup_datetime  time.Time
    tpep_dropoff_datetime time.Time
    trip_distance         float64
    fare_amount           float64
    pickup_zip            int
    dropoff_zip           int
  )

  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)
  }
}

그리고 이러한 함수를 호출하는 main.go라는 이름의 파일을 가정합니다.

package main

import (
  "os"
)

func main() {
  db, err := GetDBWithDSNPAT(os.Getenv("DATABRICKS_DSN"))
  if err != nil {
    panic(err)
  }

  rows, err := GetNYCTaxiTrips(db, 2)
  if err != nil {
    panic(err)
  }

  PrintNYCTaxiTrips(rows)
}

helpers_test.go(으)로 명명된 다음 파일은 GetNYCTaxiTrips 함수가 예상 응답을 반환하는지 여부를 테스트합니다. 이 테스트는 대상 작업 영역에 대한 실제 연결을 만드는 대신 sql.DB 개체를 모의합니다. 또한 이 테스트는 실제 데이터에 있는 스키마 및 값을 준수하는 일부 데이터를 모의합니다. 이 테스트는 모의 연결을 통해 모의 데이터를 반환한 다음 모의 데이터 행 값 중 하나가 예상 값과 일치하는지 확인합니다.

package main

import (
  "database/sql"
  "testing"

  "github.com/stretchr/testify/assert"
  "github.com/stretchr/testify/mock"
)

// Define an interface that contains a method with the same signature
// as the real GetNYCTaxiTrips function that you want to test.
type MockGetNYCTaxiTrips interface {
  GetNYCTaxiTrips(db *sql.DB, numRows int) (*sql.Rows, error)
}

// Define a struct that represents the receiver of the interface's method
// that you want to test.
type MockGetNYCTaxiTripsObj struct {
  mock.Mock
}

// Define the behavior of the interface's method that you want to test.
func (m *MockGetNYCTaxiTripsObj) GetNYCTaxiTrips(db *sql.DB, numRows int) (*sql.Rows, error) {
  args := m.Called(db, numRows)
  return args.Get(0).(*sql.Rows), args.Error(1)
}

func TestGetNYCTaxiTrips(t *testing.T) {
  // Instantiate the receiver.
  mockGetNYCTaxiTripsObj := new(MockGetNYCTaxiTripsObj)

  // Define how the mock function should be called and what it should return.
  // We're not concerned with whether the actual database is connected to--just
  // what is returned.
  mockGetNYCTaxiTripsObj.On("GetNYCTaxiTrips", mock.Anything, mock.AnythingOfType("int")).Return(&sql.Rows{}, nil)

  // Call the mock function that you want to test.
  rows, err := mockGetNYCTaxiTripsObj.GetNYCTaxiTrips(nil, 2)

  // Assert that the mock function was called as expected.
  mockGetNYCTaxiTripsObj.AssertExpectations(t)

  // Assert that the mock function returned what you expected.
  assert.NotNil(t, rows)
  assert.Nil(t, err)
}

GetNYCTaxiTrips 함수는 SELECT 문을 포함하기 때문에 trips 테이블의 상태를 변경하지 않으므로 이 예제에서는 모의 작업이 반드시 필요하지는 않습니다. 그러나 모의 작업을 사용하면 작업 영역과의 실제 연결을 기다리지 않고 테스트를 신속하게 실행할 수 있습니다. 또한 모의 작업을 사용하면 INSERT INTO, UPDATEDELETE FROM과 같은 테이블의 상태를 변경할 수 있는 함수에 대해 시뮬레이션된 테스트를 여러 번 실행할 수 있습니다.

추가 리소스