Aracılığıyla paylaş


Go için Databricks SQL Sürücüsü

Go için Databricks SQL Sürücüsü, Azure Databricks işlem kaynaklarında SQL komutlarını çalıştırmak için Go kodunu kullanmanıza olanak tanıyan bir Go kitaplığıdır. Bu makalede Go README için Databricks SQL Sürücüsü, API başvurusu ve örnekler desteklenir.

Gereksinimler

Go için Databricks SQL Sürücüsü ile çalışmaya başlama

  1. Go 1.20 veya üzeri yüklü ve zaten oluşturulmuş bir Go kodu projesi bulunan geliştirme makinenizde, komutunu çalıştırarak go.mod Go kodunuzun bağımlılıklarını izlemek için bir go mod init dosya oluşturun, örneğin:

    go mod init sample
    
  2. Go için Databricks SQL Sürücüsü paketine bağımlı olmak için go mod edit -require komutunu çalıştırın ve v1.5.2 yerine, Sürümler'de listelenen Databricks SQL Driver for Go paketinin en son sürümünü kullanın.

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

    Dosyanız go.mod şu şekilde görünmelidir:

    module sample
    
    go 1.20
    
    require github.com/databricks/databricks-sql-go v1.5.2
    
  3. Projenizde, Go için Databricks SQL Sürücüsünü içeri aktaran bir Go kod dosyası oluşturun. Aşağıdaki örnek, aşağıdaki içeriklere sahip adlı main.go bir dosyada Azure Databricks çalışma alanınızdaki tüm kümeleri listeler:

    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. komutunu çalıştırarak go mod tidy eksik modül bağımlılıklarını ekleyin:

    go mod tidy
    

    Not

    Hata go: warning: "all" matched no packages kodunu alırsanız, Go için Databricks SQL Sürücüsünü import eden bir Go kod dosyasını eklemeyi unuttunuz.

  5. komutunu çalıştırarak modülünüzdeki main paketlerin derlemelerini ve testlerini desteklemek için gereken tüm paketlerin kopyalarını go mod vendor oluşturun:

    go mod vendor
    
  6. Azure Databricks kimlik doğrulaması için DATABRICKS_DSN ortam değişkenini ayarlamak amacıyla kodunuzu gerektiği gibi değiştirin. Ayrıca bkz . DSN bağlantı dizesiyle bağlanma.

  7. Go kod dosyanızı, main.go adlı bir dosyayı varsayarak go run komutunu çalıştırarak çalıştırın.

    go run main.go
    
  8. Hata döndürülmezse, Azure Databricks çalışma alanınızla Go için Databricks SQL Sürücüsünün kimliğini başarıyla doğrulamış ve bu çalışma alanındaki çalışan Azure Databricks kümenize veya SQL ambarınıza bağlanmış olursunuz.

DSN bağlantı dizesi ile bağlanma

sql.Open()'yı veri kaynağı adı (DSN) bağlantı dizesi aracılığıyla veritabanı tanıtıcısı oluşturmak için kullanın, kümelere ve SQL ambarlarına erişim sağlayın. Bu kod örneği, adlı DATABRICKS_DSNbir ortam değişkeninden DSN bağlantı dizesi alır:

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 bağlantı dizesini doğru biçimde belirtmek için Kimlik Doğrulaması'ndaki DSN bağlantı dizesi örneklerine bakın. Örneğin, Azure Databricks kişisel erişim jetonu kimlik doğrulaması için aşağıdaki söz dizimini kullanın; burada:

  • <personal-access-token> gereksinimler listesindeki Azure Databricks kişisel erişim belirtecinizdir.
  • <server-hostname> , gereksinimlerden Sunucu Ana Bilgisayar Adı değeridir.
  • <port-number>, gereksinimlerdeki Port değeridir ve genellikle 443'dir.
  • <http-path> , gereksinimlerden http yolu değeridir.
  • <paramX=valueX> , bu makalenin devamında listelenen bir veya daha fazla İsteğe bağlı parametredir .
token:<personal-access-token>@<server-hostname>:<port-number>/<http-path>?<param1=value1>&<param2=value2>

Örneğin, bir küme için:

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

Örneğin, bir SQL ambarı için:

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

Not

Güvenlik açısından en iyi uygulama olarak, bu DSN bağlantı dizesini Go kodunuza sabit kodlamamalısınız. Bunun yerine, bu DSN bağlantı dizesi güvenli bir konumdan almanız gerekir. Örneğin, bu makalenin önceki bölümlerindeki kod örneğinde bir ortam değişkeni kullanılmıştır.

İsteğe bağlı parametreler

  • Desteklenen isteğe bağlı bağlantı parametreleri içinde <param=value>belirtilebilir. Daha sık kullanılanlardan bazıları şunlardır:
    • catalog: Oturumdaki ilk katalog adını ayarlar.
    • schema: Oturumdaki ilk şema adını ayarlar.
    • maxRows: İstek başına getirilen en fazla satır sayısını ayarlar. Varsayılan değer: 10000.
    • timeout: Sunucu sorgusu yürütmesi için zaman aşımını (saniye olarak) ekler. Varsayılan olarak zaman aşımı yoktur.
    • userAgentEntry: İş ortaklarını tanımlamak için kullanılır. Daha fazla bilgi için iş ortağınızın belgelerine bakın.
  • Desteklenen isteğe bağlı oturum parametreleri içinde param=valuebelirtilebilir. Daha sık kullanılanlardan bazıları şunlardır:
    • ansi_mode: Boole dizesi. true oturum deyimlerinin ANSI SQL belirtimi tarafından belirtilen kurallara uyması için. Sistem varsayılanı false'tur.
    • timezone: Dize, örneğin America/Los_Angeles. Oturumun saat dilimini ayarlar. Sistem varsayılanı UTC'dir.
    • query_tags: system.query.history için izleme amacıyla SQL sorgularına eklenecek virgülle ayrılmış anahtar:değer çiftleri dizesi, örneğin team:engineering,dashboard:abc123. Bu özellik Genel Önizleme aşamasındadır.

Örneğin, bir SQL ambarı için:

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

İşlevle NewConnector bağlan

Alternatif olarak, sql.OpenDB() ile oluşturulan yeni bir bağlayıcı nesnesi aracılığıyla dbsql.NewConnector() kullanarak veritabanı tanıtıcısı oluşturun (Azure Databricks kümelerine ve SQL ambarlarına yeni bir bağlayıcı nesnesiyle bağlanmak için Go için Databricks SQL Sürücüsü'nün v1.0.0 veya daha üstü gerekir). Örneğin:

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

Doğru ayar kümesini NewConnector belirtmek için Kimlik Doğrulaması'ndaki örneklere bakın.

Not

En iyi güvenlik uygulaması olarak, ayarlarınızı Go kodunuzla NewConnector sabit olarak kodlamayın. Bunun yerine, bu değerleri güvenli bir konumdan almanız gerekir. Örneğin, yukarıdaki kod ortam değişkenlerini kullanır.

Daha sık kullanılan işlevsel seçeneklerden bazıları şunlardır:

  • WithAccessToken(<access-token>): Gereksinimlerden Azure Databricks kişisel erişim belirteciniz. Gerekli string.
  • WithServerHostname(<server-hostname>): Gereksinimlerden Sunucu Ana Bilgisayar Adı değeri. Gerekli string.
  • WithPort(<port>): Sunucunun bağlantı noktası numarası, genellikle 443. Gerekli int.
  • WithHTTPPath(<http-path>): Gereksinimlerden HTTP Yolu değeri. Gerekli string.
  • WithInitialNamespace(<catalog>, <schema>):Oturumdaki katalog ve şema adı. İsteğe bağlıstring, string.
  • WithMaxRows(<max-rows>): İstek başına getirilen en fazla satır sayısı. Varsayılan değer 10000. İsteğe bağlıdır int.
  • WithSessionParams(<params-map>): "Saat dilimi", "ansi_mode" ve "query_tags" gibi oturum parametreleri. İsteğe bağlımap[string]string.
  • WithTimeout(<timeout>). Sunucu sorgusu çalıştırma için zaman aşımı (içinde time.Duration). Varsayılan olarak zaman aşımı yoktur. isteğe bağlı.
  • WithUserAgentEntry(<isv-name-plus-product-name>). İş ortaklarını tanımlamak için kullanılır. Daha fazla bilgi için iş ortağınızın belgelerine bakın. İsteğe bağlıstring.

Örneğin:

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

Kimlik Doğrulaması

Go için Databricks SQL Sürücüsü aşağıdaki Azure Databricks kimlik doğrulama türlerini destekler:

Go için Databricks SQL Sürücüsü henüz aşağıdaki Azure Databricks kimlik doğrulama türlerini desteklemez:

Databricks kişisel erişim jetonu kimlik doğrulaması

Go için Databricks SQL Sürücüsünü Azure Databricks kişisel erişim belirteci kimlik doğrulamasıyla kullanmak için önce bir Azure Databricks kişisel erişim belirteci oluşturmanız gerekir. Bu adımla ilgili ayrıntılar için bkz. Çalışma alanı kullanıcıları için kişisel erişim belirteçleri oluşturma.

Go için Databricks SQL Sürücüsünün kimliğini bir DSN bağlantı dizesiyle ve DSN bağlantı dizesiyle bağlanma'daki kod örneğiyle doğrulamak için aşağıdaki DSN bağlantı dizesi söz dizimini kullanın; burada:

  • <personal-access-token> gereksinimler listesindeki Azure Databricks kişisel erişim belirtecinizdir.
  • <server-hostname> , gereksinimlerden Sunucu Ana Bilgisayar Adı değeridir.
  • <port-number>, gereksinimlerdeki Port değeridir ve genellikle 443'dir.
  • <http-path> , gereksinimlerden http yolu değeridir.

Ayrıca, bu makalede daha önce listelenen bir veya daha fazla İsteğe bağlı parametre de ekleyebilirsiniz.

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

Go için Databricks SQL Sürücüsünün NewConnector kimliğini işlevle doğrulamak için aşağıdaki kod parçacığını ve aşağıdaki ortam değişkenlerini ayarladığınızı varsayan İşlevle NewConnector bağlan'daki kod örneğini kullanın:

  • DATABRICKS_SERVER_HOSTNAMEdeğerini kümenizin veya SQL ambarınızın Sunucu Ana Bilgisayar Adı değerine ayarlayın.
  • DATABRICKS_HTTP_PATH, kümeniz veya SQL ambarınız için HTTP Yolu değeri olarak ayarlayın.
  • DATABRICKS_TOKEN, Azure Databricks kişisel erişim belirtecine ayarlayın.

Ortam değişkenlerini ayarlamak için işletim sisteminizin belgelerine bakın.

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 belirteci kimlik doğrulaması

Go için Databricks SQL Sürücüsü, Azure Databricks kullanıcısı veya Microsoft Entra ID hizmet sorumlusu için Microsoft Entra ID belirteçlerini destekler.

Microsoft Entra ID erişim belirteci oluşturmak için aşağıdakileri yapın:

  • Azure Databricks kullanıcısı veya Microsoft Entra ID hizmet sorumlusu için Azure CLI'yı kullanın. Bkz. Microsoft Entra Id belirteçlerini el ile alma. Microsoft Entra ID yönetilen bir hizmet ilkesi oluşturmak için bkz. Hizmet ilkeleri.

    Microsoft Entra Id belirteçlerinin varsayılan ömrü yaklaşık 1 saattir. Yeni bir Microsoft Entra Id belirteci oluşturmak için bu işlemi yineleyin.

    Go için Databricks SQL Sürücüsünün kimliğini bir DSN bağlantı dizesiyle ve DSN bağlantı dizesiyle bağlanma'daki kod örneğiyle doğrulamak için aşağıdaki DSN bağlantı dizesi söz dizimini kullanın; burada:

    • <microsoft-entra-id-token> , Microsoft Entra Id belirtecinizdir.
    • <server-hostname> , gereksinimlerden Sunucu Ana Bilgisayar Adı değeridir.
    • <port-number>, gereksinimlerdeki Port değeridir ve genellikle 443'dir.
    • <http-path> , gereksinimlerden http yolu değeridir.

    Ayrıca, bu makalede daha önce listelenen bir veya daha fazla İsteğe bağlı parametre de ekleyebilirsiniz.

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

    Go için Databricks SQL Sürücüsünün NewConnector kimliğini işlevle doğrulamak için aşağıdaki kod parçacığını ve aşağıdaki ortam değişkenlerini ayarladığınızı varsayan İşlevle NewConnector bağlan'daki kod örneğini kullanın:

    • DATABRICKS_SERVER_HOSTNAMEdeğerini kümenizin veya SQL ambarınızın Sunucu Ana Bilgisayar Adı değerine ayarlayın.
    • DATABRICKS_HTTP_PATH, kümeniz veya SQL ambarınız için HTTP Yolu değeri olarak ayarlayın.
    • DATABRICKS_TOKEN öğesini Microsoft Entra ID belirtecine ayarlayın.

    Ortam değişkenlerini ayarlamak için işletim sisteminizin belgelerine bakın.

    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 kullanıcıdan makineye (U2M) kimlik doğrulaması

Go için Databricks SQL Sürücüsü 1.5.0 ve üzeri sürümler OAuth kullanıcıdan makineye (U2M) kimlik doğrulamasını destekler.

Go için Databricks SQL Sürücüsünü bir DSN bağlantı dizesiyle ve DSN bağlantı dizesiyle bağlanma'daki kod örneğiyle kullanmak için aşağıdaki DSN bağlantı dizesi söz dizimini kullanın; burada:

  • <server-hostname> , gereksinimlerden Sunucu Ana Bilgisayar Adı değeridir.
  • <port-number>, gereksinimlerdeki Port değeridir ve genellikle 443'dir.
  • <http-path> , gereksinimlerden http yolu değeridir.

Ayrıca, bu makalede daha önce listelenen bir veya daha fazla İsteğe bağlı parametre de ekleyebilirsiniz.

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

Go için Databricks SQL Sürücüsünü NewConnector işleviyle kimlik doğrulaması yapmak için import bildiriminize önce aşağıdakileri eklemeniz gerekir.

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

Ardından aşağıdaki kod parçacığını ve aşağıdaki ortam değişkenlerini ayarladığınızı varsayan İşlevle NewConnector bağlan'daki kod örneğini kullanın:

  • DATABRICKS_SERVER_HOSTNAMEdeğerini kümenizin veya SQL ambarınızın Sunucu Ana Bilgisayar Adı değerine ayarlayın.
  • DATABRICKS_HTTP_PATH, kümeniz veya SQL ambarınız için HTTP Yolu değeri olarak ayarlayın.

Ortam değişkenlerini ayarlamak için işletim sisteminizin belgelerine bakın.

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 makineler arası (M2M) kimlik doğrulaması

Go için Databricks SQL Sürücüsü 1.5.2 ve üzeri sürümler OAuth makineden makineye (M2M) kimlik doğrulamasını destekler.

Go için Databricks SQL Sürücüsünü OAuth M2M kimlik doğrulamasıyla kullanmak için aşağıdakileri yapmanız gerekir:

  1. Azure Databricks çalışma alanınızda bir Azure Databricks hizmet ilkesi oluşturun ve bu hizmet ilkesi için bir OAuth gizli anahtar oluşturun.

    Hizmet asıl nesnesini ve OAuth gizli anahtarını oluşturmak için bkz. OAuth ile Azure Databricks'e hizmet asıl nesnesi erişimi yetkilendirme. Hizmet prensibinin UUID veya Uygulama Kimliği değerini ve hizmet prensibinin OAuth gizli anahtarı için Gizli Anahtar değerini not edin.

  2. Bu hizmet sorumlusuna kümenize veya ambarınıza erişim verin.

    Hizmet sorumlusuna kümenize veya ambarınıza erişim vermek için bkz . İşlem izinleri veya SQL ambarını yönetme.

Go için Databricks SQL Sürücüsünün kimliğini bir DSN bağlantı dizesiyle ve DSN bağlantı dizesiyle bağlanma'daki kod örneğiyle doğrulamak için aşağıdaki DSN bağlantı dizesi söz dizimini kullanın; burada:

  • <server-hostname> , gereksinimlerden Sunucu Ana Bilgisayar Adı değeridir.
  • <port-number>, gereksinimlerdeki Port değeridir ve genellikle 443'dir.
  • <http-path> , gereksinimlerden http yolu değeridir.
  • <client-id> hizmet sorumlusunun UUID veya Uygulama Kimliği değeridir.
  • <client-secret>, hizmet sorumlusunun OAuth gizli anahtarının Gizli değeridir.

Ayrıca, bu makalede daha önce listelenen bir veya daha fazla İsteğe bağlı parametre de ekleyebilirsiniz.

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

Go için Databricks için SQL Sürücüsünü NewConnector fonksiyonu ile doğrulamak için, önce şu ifadeyi import bildiriminize eklemeniz gerekir:

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

Ardından aşağıdaki kod parçacığını ve aşağıdaki ortam değişkenlerini ayarladığınızı varsayan İşlevle NewConnector bağlan'daki kod örneğini kullanın:

  • DATABRICKS_SERVER_HOSTNAMEdeğerini kümenizin veya SQL ambarınızın Sunucu Ana Bilgisayar Adı değerine ayarlayın.
  • DATABRICKS_HTTP_PATH, kümeniz veya SQL ambarınız için HTTP Yolu değeri olarak ayarlayın.
  • DATABRICKS_CLIENT_IDdeğerini hizmet sorumlusunun UUID veya Uygulama Kimliği değerine ayarlayın.
  • DATABRICKS_CLIENT_SECRET, hizmet principal'inin OAuth gizli anahtarı için Gizli değerine ayarlayın.

Ortam değişkenlerini ayarlamak için işletim sisteminizin belgelerine bakın.

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

Verileri sorgulama

Aşağıdaki kod örneği, Azure Databricks işlem kaynağında temel bir SQL sorgusu çalıştırmak için Go için Databricks SQL Sürücüsünün nasıl çağrılduğunu gösterir. Bu komut, kataloğun trips şemasındaki tablodan samplesnyctaxi ilk iki satırı döndürür.

Bu kod örneği, DATABRICKS_DSN adlı bir ortam değişkeninden DSN bağlantı dizesini alır.

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 Kataloğu birimlerindeki dosyaları yönetme

Databricks SQL Sürücüsü, aşağıdaki örnekte gösterildiği gibi Unity Kataloğu birimlerine yerel dosyalar yazmanızı, birimlerden dosya indirmenizi ve birimlerden dosya silmenizi sağlar:

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

Loglama

Databricks SQL Go Sürücüsünün kaydettiği iletileri günlüğe kaydetmek için github.com/databricks/databricks-sql-go/logger kullanın. Aşağıdaki kod örneği, bir DSN bağlantı dizesi aracılığıyla veritabanı tanıtıcısı oluşturmak için sql.Open() kullanır. Bu kod örneği, adlı DATABRICKS_DSNbir ortam değişkeninden DSN bağlantı dizesi alır. debug düzeyinde ve altında yayılan tüm günlük iletileri results.log dosyasına yazılır.

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

Test Etme

Kodunuzu test etmek için test standart kitaplığı gibi Go test çerçevelerini kullanın. Azure Databricks REST API uç noktalarını çağırmadan veya Azure Databricks hesaplarınızın veya çalışma alanlarınızın durumunu değiştirmeden kodunuzu simüle edilmiş koşullar altında test etmek için testify gibi Go mocklama kütüphanelerini kullanın.

Örneğin, Azure Databricks çalışma alanı bağlantısı döndüren bir helpers.go işlev içeren, adı GetDBWithDSNPAT olan aşağıdaki dosya, kataloğun GetNYCTaxiTrips şemasındaki trips tablodan samples veri döndüren bir nyctaxi işlev ve döndürülen verileri yazdıran bir PrintNYCTaxiTrips işlev verilmiştir:

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

Aşağıdaki işlevleri çağıran main.go adlı dosya göz önünde bulundurulduğunda:

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

Adlı aşağıdaki dosya helpers_test.go , işlevin GetNYCTaxiTrips beklenen yanıtı döndürip döndürmediğini sınar. Bu test, hedef çalışma alanına gerçek bir bağlantı oluşturmak yerine bir sql.DB nesnesini taklit eder. Test ayrıca şemaya ve gerçek verilerdeki değerlere uyan bazı verileri taklit eder. Test, sahte bağlantı üzerinden sahte verileri döndürür ve ardından sahte veri satırlarından birinin değerlerinin beklenen değerle eşleşip eşleşmediğini denetler.

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 işlevi bir SELECT deyim içerdiğinden ve bu nedenle trips tablosunun durumunu değiştirmediğinden, bu örnekte taklit etmek kesinlikle gerekli değildir. Ancak mock işlemi, çalışma alanına gerçek bir bağlantı kurmadan testlerinizi hızlıca çalıştırmanızı sağlar. Ayrıca, sahtecilik, bir tablonun durumunu değiştirebilecek INSERT INTO, UPDATE ve DELETE FROM gibi işlevler için simülasyon testlerini birden çok kez çalıştırmanıza olanak tanır.

Ek kaynaklar