Bagikan melalui


Driver SQL Databricks untuk Go

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 Menyambungkan 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 handel database melalui nama sumber data (DSN) string koneksi. 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: Menyiapkan jumlah maksimum baris yang diambil per 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. Default sistem adalah false.
    • timezone: String, misalnya America/Los_Angeles. Mengatur zona waktu sesi. Default sistem adalah UTC.

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

Menyambungkan NewConnector dengan fungsi

Atau, gunakan sql.OpenDB() untuk membuat handel database melalui objek konektor baru yang dibuat dengan dbsql.NewConnector() (menyambungkan ke kluster Azure Databricks dan gudang SQL dengan objek konektor baru memerlukan v1.0.0 atau lebih tinggi dari Driver SQL Databricks untuk 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 terbaik keamanan, Anda tidak boleh membuat kode keras 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 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>):Katalog dan nama skema dalam sesi. 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" dan "ansi_mode". map[string]string opsional.
  • WithTimeout(<timeout>). Batas waktu (dalam time.Duration) untuk eksekusi kueri 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"}),
  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, sebagai berikut:

  1. Di ruang kerja Azure Databricks Anda, klik nama pengguna Azure Databricks Anda di bilah atas, lalu pilih Pengaturan dari menu drop-down.
  2. Klik Pengembang.
  3. Di samping Token akses, klik Kelola.
  4. Klik Buat token baru.
  5. (Opsional) Masukkan komentar yang membantu Anda mengidentifikasi token ini di masa mendatang, dan mengubah masa pakai default token selama 90 hari. Untuk membuat token tanpa masa pakai (tidak disarankan), biarkan kotak Seumur Hidup (hari) kosong (kosong).
  6. Klik Buat.
  7. Salin token yang ditampilkan ke lokasi aman, lalu klik Selesai.

Catatan

Pastikan untuk menyimpan token yang disalin di lokasi yang aman. Jangan bagikan token yang Anda salin dengan orang lain. Jika Anda kehilangan token yang disalin, Anda tidak dapat meregenerasi token yang sama persis. Sebagai gantinya, Anda harus mengulangi prosedur ini untuk membuat token baru. Jika Anda kehilangan token yang disalin, atau Anda yakin bahwa token telah disusupi, Databricks sangat menyarankan agar Anda segera menghapus token tersebut dari ruang kerja Anda dengan mengklik ikon tempat sampah (Cabut) di samping token di halaman Token akses.

Jika Anda tidak dapat membuat atau menggunakan token di ruang kerja, ini mungkin karena administrator ruang kerja Anda telah menonaktifkan token atau belum memberi Anda izin untuk membuat atau menggunakan token. Lihat administrator ruang kerja Anda atau berikut 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:

  • <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 fungsi NewConnector, 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 ID Microsoft Entra (sebelumnya Azure Active Directory)

Driver SQL Databricks untuk Go mendukung token ID Microsoft Entra (sebelumnya Azure Active Directory) untuk pengguna Azure Databricks atau perwakilan layanan ID Microsoft Entra.

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

  • Untuk pengguna Azure Databricks, Anda dapat menggunakan Azure CLI. Lihat Mendapatkan token MICROSOFT Entra ID (sebelumnya Azure Active Directory) untuk pengguna dengan menggunakan Azure CLI.

    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 fungsi NewConnector, 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 komputer (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 NewConnector fungsi , 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 fungsi NewConnector, 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 mesin-ke-mesin (M2M) OAuth

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 Menggunakan perwakilan layanan untuk mengautentikasi dengan Azure Databricks. Catat nilai UUID atau ID Aplikasi perwakilan layanan, dan 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 rahasia 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 NewConnector fungsi , Anda harus terlebih dahulu menambahkan yang berikut ke deklarasi Anda import :

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

Kemudian gunakan cuplikan kode berikut dan contoh kode di Sambungkan dengan fungsi NewConnector, 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, atur ke nilai Rahasia untuk rahasia OAuth 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 dipancarkan pada tingkat dan di debug bawah ini ditulis ke results.log file.

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, mengingat file berikut bernama helpers.go yang berisi GetDBWithDSNPAT fungsi yang mengembalikan koneksi ruang kerja Azure Databricks, GetNYCTaxiTrips fungsi yang mengembalikan data dari trips tabel dalam samples skema nyctaxi katalog, 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 " + 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)
  }
}

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 mengejek sql.DB objek. Pengujian ini juga meniru beberapa data yang sesuai dengan skema dan nilai yang ada dalam data nyata. Pengujian mengembalikan data yang ditidakan melalui koneksi yang ditidakan lalu memeriksa apakah salah satu nilai baris data yang ditidakan 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)
}

GetNYCTaxiTrips Karena fungsi berisi SELECT pernyataan dan oleh karena itu tidak mengubah status trips tabel, tiruan tidak benar-benar diperlukan dalam contoh ini. Namun, tiruan memungkinkan Anda menjalankan pengujian dengan cepat tanpa menunggu koneksi aktual 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: