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
- Mesin pengembangan yang menjalankan Go, versi 1.20 atau lebih tinggi. Untuk mencetak versi Go yang diinstal, jalankan perintah
go version
. Unduh dan instal Go. - Kluster atau Gudang SQL yang sudah ada.
- Nilai Nama Host Server, Port, dan Jalur HTTP untuk kluster atau gudang SQL yang ada.
Mulai menggunakan Driver SQL Databricks untuk Go
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 menjalankango mod init
perintah, misalnya:go mod init sample
Ambil dependensi pada paket Databricks SQL Driver for Go dengan menjalankan
go mod edit -require
perintah , menggantiv1.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
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) } }
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.Buat salinan semua paket yang diperlukan untuk mendukung build dan pengujian paket dalam modul Anda
main
, dengan menjalankango mod vendor
perintah:go mod vendor
Ubah kode Anda sesuai kebutuhan untuk mengatur
DATABRICKS_DSN
variabel lingkungan untuk autentikasi Azure Databricks. Lihat juga Menyambungkan dengan string koneksi DSN.Jalankan file kode Go Anda, dengan asumsi file bernama
main.go
, dengan menjalankango run
perintah:go run main.go
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 biasanya443
.<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 adalah10000
.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, misalnyaAmerica/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. Diperlukanstring
.WithServerHostname(<server-hostname>)
: Nilai Nama Host Server dari persyaratan. Diperlukanstring
.WithPort(<port>)
: Nomor port server, biasanya443
. Diperlukanint
.WithHTTPPath(<http-path>)
: Nilai Jalur HTTP dari persyaratan. Diperlukanstring
.WithInitialNamespace(<catalog>, <schema>)
:Katalog dan nama skema dalam sesi.string, string
opsional.WithMaxRows(<max-rows>)
: Jumlah maksimum baris yang diambil per permintaan. Defaultnya adalah10000.
Opsionalint
.WithSessionParams(<params-map>)
: Parameter sesi termasuk "zona waktu" dan "ansi_mode".map[string]string
opsional.WithTimeout(<timeout>)
. Batas waktu (dalamtime.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:
- Autentikasi token akses pribadi Databricks
- Autentikasi token ID Microsoft Entra
- Autentikasi pengguna ke komputer (U2M) OAuth
- Autentikasi mesin-ke-mesin (M2M) OAuth
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:
- Di ruang kerja Azure Databricks Anda, klik nama pengguna Azure Databricks Anda di bilah atas, lalu pilih Pengaturan dari menu drop-down.
- Klik Pengembang.
- Di samping Token akses, klik Kelola.
- Klik Buat token baru.
- (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).
- Klik Buat.
- 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 topik berikut:
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 biasanya443
.<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_HOSTNAME
atur 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
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, Anda dapat menggunakan Azure CLI. Lihat Mendapatkan token ID Microsoft Entra untuk pengguna dengan menggunakan Azure CLI.
- Untuk perwakilan layanan ID Microsoft Entra, lihat Mendapatkan token akses ID Microsoft Entra dengan Azure CLI. Untuk membuat perwakilan layanan terkelola ID Microsoft Entra, lihat Mengelola 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 biasanya443
.<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_HOSTNAME
atur 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 biasanya443
.<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_HOSTNAME
atur 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:
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 Mengautentikasi akses ke Azure Databricks dengan perwakilan layanan menggunakan OAuth (OAuth M2M). Catat nilai UUID atau ID Aplikasi perwakilan layanan, dan nilai Rahasia untuk rahasia OAuth perwakilan layanan.
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 biasanya443
.<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_HOSTNAME
atur 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:
- Repositori Databricks SQL Driver for Go di GitHub
- Halaman beranda paket database/sql
- Contoh Driver SQL Databricks untuk Go di GitHub