Bagikan melalui


Driver untuk Go SQL Databricks

Driver SQL Databricks untuk Go adalah pustaka Go yang memungkinkan Anda menggunakan kode Go untuk menjalankan perintah SQL pada sumber daya komputasi Azure Databricks. Artikel ini melengkapi Driver SQL Databricks untuk Go README, referensi API, dan contoh.

Persyaratan

Mulai menggunakan Driver SQL Databricks untuk Go

  1. Pada komputer pengembangan Anda dengan Go 1.20 atau yang lebih baru sudah diinstal dan proyek kode Go yang sudah dibuat, buat go.mod file untuk melacak dependensi kode Go Anda dengan menjalankan go mod init perintah, misalnya:

    go mod init sample
    
  2. Ambil dependensi pada paket Databricks SQL Driver for Go dengan menjalankan go mod edit -require perintah , mengganti v1.5.2 dengan versi terbaru paket Databricks SQL Driver for Go seperti yang tercantum dalam Rilis:

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

    Sekarang file go.mod Anda akan terlihat seperti ini:

    module sample
    
    go 1.20
    
    require github.com/databricks/databricks-sql-go v1.5.2
    
  3. Dalam proyek Anda, buat file kode Go yang mengimpor Driver SQL Databricks untuk Go. Contoh berikut, dalam file main.go bernama dengan konten berikut, mencantumkan semua kluster di ruang kerja Azure Databricks Anda:

    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. Tambahkan dependensi modul yang hilang dengan menjalankan go mod tidy perintah:

    go mod tidy
    

    Catatan

    Jika Anda mendapatkan kesalahan go: warning: "all" matched no packages, Anda lupa menambahkan file kode Go yang mengimpor Driver SQL Databricks untuk Go.

  5. Buat salinan semua paket yang diperlukan untuk mendukung build dan pengujian paket dalam modul Anda main , dengan menjalankan go mod vendor perintah:

    go mod vendor
    
  6. Ubah kode Anda sesuai kebutuhan untuk mengatur DATABRICKS_DSN variabel lingkungan untuk autentikasi Azure Databricks. Lihat juga Sambungkan dengan string koneksi DSN.

  7. Jalankan file kode Go Anda, dengan asumsi file bernama main.go, dengan menjalankan go run perintah:

    go run main.go
    
  8. Jika tidak ada kesalahan yang dikembalikan, Anda telah berhasil mengautentikasi Driver SQL Databricks untuk Go dengan ruang kerja Azure Databricks Anda dan terhubung ke kluster Azure Databricks atau gudang SQL yang sedang berjalan di ruang kerja tersebut.

Menyambungkan dengan string koneksi DSN

Untuk mengakses kluster dan gudang SQL, gunakan sql.Open() untuk membuat database handle melalui string koneksi nama sumber data (DSN). Contoh kode ini mengambil string koneksi DSN dari variabel lingkungan bernama 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)
  }
}

Untuk menentukan string koneksi DSN dalam format yang benar, lihat contoh string koneksi DSN di Autentikasi. Misalnya, untuk autentikasi token akses pribadi Azure Databricks, gunakan sintaks berikut, di mana:

  • <personal-access-token> adalah token akses pribadi Azure Databricks Anda dari persyaratan.
  • <server-hostname> adalah nilai Nama Host Server dari persyaratan.
  • <port-number> adalah nilai Port dari persyaratan, yang biasanya 443.
  • <http-path> adalah nilai Jalur HTTP dari persyaratan.
  • <paramX=valueX> adalah satu atau beberapa Parameter opsional yang tercantum nanti dalam artikel ini.
token:<personal-access-token>@<server-hostname>:<port-number>/<http-path>?<param1=value1>&<param2=value2>

Misalnya, untuk kluster:

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

Misalnya, bagi gudang SQL:

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

Catatan

Sebagai praktik terbaik keamanan, Anda tidak boleh membuat kode keras string koneksi DSN ini ke dalam kode Go Anda. Sebagai gantinya, Anda harus mengambil string koneksi DSN ini dari lokasi yang aman. Misalnya, contoh kode sebelumnya dalam artikel ini menggunakan variabel lingkungan.

Parameter opsional

  • Parameter koneksi opsional yang didukung dapat ditentukan dalam <param=value>. Beberapa yang lebih sering digunakan meliputi:
    • catalog: Mengatur nama katalog awal dalam sesi.
    • schema: Mengatur nama skema awal dalam sesi.
    • maxRows: Mengatur jumlah maksimum baris yang diambil setiap permintaan. Default adalah 10000.
    • timeout: Menambahkan batas waktu (dalam detik) untuk eksekusi kueri server. Defaultnya adalah tidak ada batas waktu.
    • userAgentEntry: Digunakan untuk mengidentifikasi mitra. Untuk informasi selengkapnya, lihat dokumentasi mitra Anda.
  • Parameter sesi opsional yang didukung dapat ditentukan dalam param=value. Beberapa yang lebih sering digunakan meliputi:
    • ansi_mode: String Boolean. true untuk pernyataan sesi untuk mematuhi aturan yang ditentukan oleh spesifikasi ANSI SQL. Pengaturan awal sistem adalah tidak aktif.
    • timezone: String, misalnya America/Los_Angeles. Mengatur zona waktu sesi. Default sistem adalah UTC.
    • query_tags: String pasangan kunci:nilai yang dipisahkan koma untuk dilampirkan ke kueri SQL untuk pelacakan di system.query.history, misalnya, team:engineering,dashboard:abc123. Fitur ini ada di Pratinjau Umum.

Misalnya, bagi gudang 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&query_tags=team:engineering,env:prod

Sambungkan ke NewConnector fungsi

Atau, gunakan sql.OpenDB() untuk membuat database handle melalui objek konektor baru yang dibuat dengan dbsql.NewConnector() (menghubungkan ke Azure Databricks clusters dan SQL warehouses dengan objek konektor baru memerlukan v1.0.0 atau lebih tinggi dari Databricks SQL Driver for Go). Contohnya:

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

Untuk menentukan kumpulan NewConnector pengaturan yang benar, lihat contoh dalam Autentikasi.

Catatan

Sebagai praktik keamanan terbaik, Anda tidak boleh menanamkan secara langsung pengaturan Anda NewConnector ke dalam kode Go Anda. Sebagai gantinya, Anda harus mengambil nilai-nilai ini dari lokasi yang aman. Misalnya, kode sebelumnya menggunakan variabel lingkungan.

Beberapa opsi fungsi yang lebih sering digunakan meliputi:

  • WithAccessToken(<access-token>): Token akses pribadi Azure Databricks Anda dari bagian persyaratan. Diperlukan string.
  • WithServerHostname(<server-hostname>): Nilai Nama Host Server dari persyaratan. Diperlukan string.
  • WithPort(<port>): Nomor port server, biasanya 443. Diperlukan int.
  • WithHTTPPath(<http-path>): Nilai Jalur HTTP dari persyaratan. Diperlukan string.
  • WithInitialNamespace(<catalog>, <schema>): Nama katalog dan skema dalam sesi tersebut. string, string opsional.
  • WithMaxRows(<max-rows>): Jumlah maksimum baris yang diambil per permintaan. Defaultnya adalah 10000. Opsional int.
  • WithSessionParams(<params-map>): Parameter sesi termasuk "zona waktu", "ansi_mode", dan "query_tags". map[string]string opsional.
  • WithTimeout(<timeout>). Waktu tunggu (dalam time.Duration) untuk menjalankan kueri pada server. Defaultnya adalah tidak ada batas waktu. Opsional.
  • WithUserAgentEntry(<isv-name-plus-product-name>). Digunakan untuk mengidentifikasi mitra. Untuk informasi selengkapnya, lihat dokumentasi mitra Anda. string opsional.

Contohnya:

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", "query_tags": "team:analytics,project:reporting"}),
  dbsql.WithTimeout(time.Minute),
  dbsql.WithUserAgentEntry("example-user"),
)

Autentikasi

Driver SQL Databricks untuk Go mendukung jenis autentikasi Azure Databricks berikut:

Driver SQL Databricks untuk Go belum mendukung jenis autentikasi Azure Databricks berikut:

Autentikasi token akses pribadi Databricks

Untuk menggunakan Driver SQL Databricks untuk Go dengan autentikasi token akses pribadi Azure Databricks, Anda harus terlebih dahulu membuat token akses pribadi Azure Databricks. Untuk detail tentang langkah ini, lihat Membuat token akses pribadi untuk pengguna ruang kerja.

Untuk mengautentikasi Driver SQL Databricks untuk Go dengan string koneksi DSN dan contoh kode di Sambungkan dengan string koneksi DSN, gunakan sintaks string koneksi DSN berikut, di mana:

  • <personal-access-token> adalah token akses pribadi Azure Databricks Anda dari persyaratan.
  • <server-hostname> adalah nilai Nama Host Server dari persyaratan.
  • <port-number> adalah nilai Port dari persyaratan, yang biasanya 443.
  • <http-path> adalah nilai Jalur HTTP dari persyaratan.

Anda juga dapat menambahkan satu atau beberapa Parameter opsional yang tercantum sebelumnya dalam artikel ini.

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

Untuk mengautentikasi Driver SQL Databricks untuk Go dengan NewConnector fungsi , gunakan cuplikan kode berikut dan contoh kode di Sambungkan dengan NewConnector fungsi , yang mengasumsikan bahwa Anda telah mengatur variabel lingkungan berikut:

  • DATABRICKS_SERVER_HOSTNAMEatur ke nilai Nama Host Server untuk kluster atau gudang SQL Anda.
  • DATABRICKS_HTTP_PATH, atur ke nilai Jalur HTTP untuk kluster atau gudang SQL Anda.
  • DATABRICKS_TOKEN, atur ke token akses pribadi Azure Databricks.

Untuk mengatur variabel lingkungan, lihat dokumentasi sistem operasi Anda.

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

Autentikasi token Microsoft Entra ID

Driver SQL Databricks untuk Go mendukung token ID Microsoft Entra untuk pengguna Azure Databricks atau perwakilan layanan ID Microsoft Entra.

Untuk membuat token akses ID Microsoft Entra, lakukan hal berikut:

  • Untuk pengguna Azure Databricks atau perwakilan layanan MICROSOFT Entra ID, gunakan Azure CLI. Lihat Mendapatkan token ID Microsoft Entra secara manual. Untuk membuat perwakilan layanan terkelola ID Microsoft Entra, lihat Perwakilan layanan.

    Token ID Microsoft Entra memiliki masa pakai default sekitar 1 jam. Untuk membuat token ID Microsoft Entra baru, ulangi proses ini.

    Untuk mengautentikasi Driver SQL Databricks untuk Go dengan string koneksi DSN dan contoh kode di Sambungkan dengan string koneksi DSN, gunakan sintaks string koneksi DSN berikut, di mana:

    • <microsoft-entra-id-token> adalah token ID Microsoft Entra Anda.
    • <server-hostname> adalah nilai Nama Host Server dari persyaratan.
    • <port-number> adalah nilai Port dari persyaratan, yang biasanya 443.
    • <http-path> adalah nilai Jalur HTTP dari persyaratan.

    Anda juga dapat menambahkan satu atau beberapa Parameter opsional yang tercantum sebelumnya dalam artikel ini.

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

    Untuk mengautentikasi Driver SQL Databricks untuk Go dengan NewConnector fungsi , gunakan cuplikan kode berikut dan contoh kode di Sambungkan dengan NewConnector fungsi , yang mengasumsikan bahwa Anda telah mengatur variabel lingkungan berikut:

    • DATABRICKS_SERVER_HOSTNAMEatur ke nilai Nama Host Server untuk kluster atau gudang SQL Anda.
    • DATABRICKS_HTTP_PATH, atur ke nilai Jalur HTTP untuk kluster atau gudang SQL Anda.
    • DATABRICKS_TOKEN, atur ke token ID Microsoft Entra Anda.

    Untuk mengatur variabel lingkungan, lihat dokumentasi sistem operasi Anda.

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

Autentikasi pengguna ke mesin (U2M) OAuth

Driver SQL Databricks untuk Go versi 1.5.0 ke atas mendukung autentikasi pengguna-ke-mesin (U2M) OAuth.

Untuk menggunakan Driver SQL Databricks untuk Go dengan string koneksi DSN dan contoh kode di Sambungkan dengan string koneksi DSN, gunakan sintaks string koneksi DSN berikut, di mana:

  • <server-hostname> adalah nilai Nama Host Server dari persyaratan.
  • <port-number> adalah nilai Port dari persyaratan, yang biasanya 443.
  • <http-path> adalah nilai Jalur HTTP dari persyaratan.

Anda juga dapat menambahkan satu atau beberapa Parameter opsional yang tercantum sebelumnya dalam artikel ini.

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

Untuk mengautentikasi Driver SQL Databricks untuk Go dengan fungsi NewConnector, Anda harus terlebih dahulu menambahkan yang berikut ke deklarasi Anda: import

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

Kemudian gunakan cuplikan kode berikut dan contoh kode di Sambungkan dengan NewConnector fungsi , yang mengasumsikan bahwa Anda telah mengatur variabel lingkungan berikut:

  • DATABRICKS_SERVER_HOSTNAMEatur ke nilai Nama Host Server untuk kluster atau gudang SQL Anda.
  • DATABRICKS_HTTP_PATH, atur ke nilai Jalur HTTP untuk kluster atau gudang SQL Anda.

Untuk mengatur variabel lingkungan, lihat dokumentasi sistem operasi Anda.

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

Autentikasi OAuth untuk mesin-ke-mesin (M2M)

Driver SQL Databricks untuk Go versi 1.5.2 ke atas mendukung autentikasi komputer-ke-mesin (M2M) OAuth.

Untuk menggunakan Driver SQL Databricks untuk Go dengan autentikasi M2M OAuth, Anda harus melakukan hal berikut:

  1. Buat perwakilan layanan Azure Databricks di ruang kerja Azure Databricks Anda, dan buat rahasia OAuth untuk perwakilan layanan tersebut.

    Untuk membuat perwakilan layanan dan rahasia OAuth-nya, lihat Mengotorisasi akses perwakilan layanan ke Azure Databricks dengan OAuth. Catat nilai UUID atau ID Aplikasi dari perwakilan layanan, serta nilai Rahasia untuk rahasia OAuth perwakilan layanan.

  2. Berikan akses perwakilan layanan tersebut ke kluster atau gudang Anda.

    Untuk memberikan akses perwakilan layanan ke kluster atau gudang Anda, lihat Izin komputasi atau Mengelola gudang SQL.

Untuk mengautentikasi Driver SQL Databricks untuk Go dengan string koneksi DSN dan contoh kode di Sambungkan dengan string koneksi DSN, gunakan sintaks string koneksi DSN berikut, di mana:

  • <server-hostname> adalah nilai Nama Host Server dari persyaratan.
  • <port-number> adalah nilai Port dari persyaratan, yang biasanya 443.
  • <http-path> adalah nilai Jalur HTTP dari persyaratan.
  • <client-id> adalah nilai UUID atau ID Aplikasi perwakilan layanan.
  • <client-secret> adalah nilai Rahasia untuk kredensial OAuth perwakilan layanan.

Anda juga dapat menambahkan satu atau beberapa Parameter opsional yang tercantum sebelumnya dalam artikel ini.

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

Untuk mengautentikasi Driver SQL Databricks untuk Go dengan fungsi NewConnector, Anda harus terlebih dahulu menambahkan berikut ke deklarasi import Anda:

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

Kemudian gunakan cuplikan kode berikut dan contoh kode di Sambungkan dengan NewConnector fungsi , yang mengasumsikan bahwa Anda telah mengatur variabel lingkungan berikut:

  • DATABRICKS_SERVER_HOSTNAMEatur ke nilai Nama Host Server untuk kluster atau gudang SQL Anda.
  • DATABRICKS_HTTP_PATH, atur ke nilai Jalur HTTP untuk kluster atau gudang SQL Anda.
  • DATABRICKS_CLIENT_ID, atur ke nilai UUID atau ID Aplikasi perwakilan layanan.
  • DATABRICKS_CLIENT_SECRET, tetapkan ke nilai Rahasia untuk kunci rahasia OAuth dari perwakilan layanan.

Untuk mengatur variabel lingkungan, lihat dokumentasi sistem operasi Anda.

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

Mengkueri data

Contoh kode berikut menunjukkan cara memanggil Driver SQL Databricks untuk Go untuk menjalankan kueri SQL dasar pada sumber daya komputasi Azure Databricks. Perintah ini mengembalikan dua baris pertama dari trips tabel dalam samples skema nyctaxi katalog.

Contoh kode ini mengambil string koneksi DSN dari variabel lingkungan bernama 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)
  }
}

Mengelola file dalam volume Katalog Unity

Driver Databricks SQL memungkinkan Anda menulis file lokal ke volume Unity Catalog, mengunduh file dari volume, dan menghapus file dari volume, seperti yang ditunjukkan dalam contoh berikut:

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

Pencatatan

Gunakan github.com/databricks/databricks-sql-go/logger untuk mencatat pesan yang dikeluarkan Driver SQL Databricks untuk Go. Contoh kode berikut menggunakan sql.Open() untuk membuat handel database melalui string koneksi DSN. Contoh kode ini mengambil string koneksi DSN dari variabel lingkungan bernama DATABRICKS_DSN. Semua pesan log yang dihasilkan pada tingkat debug dan di bawahnya ditulis ke file 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)
  }
}

Pengujian

Untuk menguji kode Anda, gunakan kerangka kerja pengujian Go seperti pustaka standar pengujian . Untuk menguji kode Anda dalam kondisi simulasi tanpa memanggil titik akhir REST API Azure Databricks atau mengubah status akun atau ruang kerja Azure Databricks Anda, gunakan pustaka mocking Go seperti testfify.

Misalnya, diberikan file berikut bernama helpers.go yang berisi fungsi GetDBWithDSNPAT yang mengembalikan koneksi ke ruang kerja Azure Databricks, fungsi GetNYCTaxiTrips yang mengembalikan data dari tabel trips dalam skema samples pada katalog nyctaxi, dan PrintNYCTaxiTrips yang mencetak data yang dikembalikan:

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

Dan diberikan file berikut bernama main.go yang memanggil fungsi-fungsi ini:

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

File berikut bernama helpers_test.go menguji apakah GetNYCTaxiTrips fungsi mengembalikan respons yang diharapkan. Daripada membuat koneksi nyata ke ruang kerja target, pengujian ini memalsukan objek sql.DB. Pengujian ini juga meniru beberapa data yang sesuai dengan skema dan nilai yang ada dalam data nyata. Pengujian mengembalikan data yang di-mock melalui koneksi yang di-mock, lalu memeriksa apakah salah satu nilai dari baris data yang di-mock cocok dengan nilai yang diharapkan.

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

Karena fungsi tersebut mengandung pernyataan SELECT dan oleh karena itu tidak mengubah status tabel trips, mocking tidak benar-benar diperlukan dalam contoh ini. Namun, mocking memungkinkan Anda melakukan pengujian dengan cepat tanpa menunggu koneksi sebenarnya dibuat dengan ruang kerja. Selain itu, mocking memungkinkan Anda menjalankan tes yang disimulasikan beberapa kali untuk fungsi yang mungkin mengubah status tabel, seperti INSERT INTO, UPDATE, dan DELETE FROM.

Sumber Daya Tambahan: