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, sürüm 1.20 veya üzerini çalıştıran bir geliştirme makinesi. Go'nun yüklü sürümünü yazdırmak için komutunu go versionçalıştırın. Go'u indirin ve yükleyin.
  • Mevcut bir küme veya SQL ambarı.
  • Mevcut küme veya SQL ambarı için Sunucu Ana Bilgisayar Adı, Bağlantı Noktası ve HTTP Yolu değerleri.

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 init Go kodunuzun bağımlılıklarını izlemek için bir go.mod dosya oluşturun, örneğin:

    go mod init sample
    
  2. Komutunu çalıştırıp go mod edit -require yerine Sürümler'de listelenen Databricks SQL Driver for Go paketinin en son sürümüyle değiştirerek v1.5.2 Go için Databricks SQL Sürücüsü paketine bağımlılık yapı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

    hatasını go: warning: "all" matched no packagesalırsanız, Go için Databricks SQL Sürücüsünü içeri aktaran bir Go kod dosyası 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 ortam değişkenini DATABRICKS_DSN ayarlamak için kodunuzu gerektiği gibi değiştirin. Ayrıca bkz. DSN bağlantı dizesi ile bağlanma.

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

    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

Kümelere ve SQL ambarlarına erişmek için veri kaynağı adı (DSN) bağlantı dizesi aracılığıyla veritabanı tanıtıcısı oluşturmak için kullanınsql.Open(). 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ı dizesi 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 belirteci kimlik doğrulaması için aşağıdaki söz dizimini kullanın; burada:

  • <personal-access-token> gereksinimlerinizden Azure Databricks kişisel erişim belirtecinizdir.
  • <server-hostname> , gereksinimlerden Sunucu Ana Bilgisayar Adı değeridir.
  • <port-number>, genellikle 443olan gereksinimlerden bağlantı noktası değeridir.
  • <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

En iyi güvenlik uygulaması olarak, bu DSN bağlantı dizesi Go kodunuzla sabit kod oluşturmamalı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 değer zaman aşımı değildir.
    • 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.

Ö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

İşlevle NewConnector bağlanma

Alternatif olarak, ile dbsql.NewConnector() oluşturulan yeni bir bağlayıcı nesnesi aracılığıyla veritabanı tanıtıcısı oluşturmak için kullanın sql.OpenDB() (Azure Databricks kümelerine ve SQL ambarlarına yeni bağlayıcı nesnesiyle bağlanmak için Go için Databricks SQL Sürücüsü v1.0.0 veya üzeri 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" ve "ansi_mode" gibi oturum parametreleri. İsteğe bağlımap[string]string.
  • WithTimeout(<timeout>). Sunucu sorgusu yürütmesi için zaman aşımı (içinde time.Duration). Varsayılan değer zaman aşımı değildir. 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"}),
  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 belirteci 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 aşağıdaki gibi bir Azure Databricks kişisel erişim belirteci oluşturmanız gerekir:

  1. Azure Databricks çalışma alanınızda üst çubukta Azure Databricks kullanıcı adınıza tıklayın ve açılan listeden Ayarlar'ı seçin.
  2. Geliştirici'ye tıklayın.
  3. Erişim belirteçleri'nin yanındaki Yönet'e tıklayın.
  4. Yeni belirteç oluştur'a tıklayın.
  5. (İsteğe bağlı) Gelecekte bu belirteci tanımlamanıza yardımcı olacak bir açıklama girin ve belirtecin varsayılan 90 günlük ömrünü değiştirin. Yaşam süresi olmayan bir belirteç oluşturmak için (önerilmez), Yaşam Süresi (gün) kutusunu boş (boş) bırakın.
  6. Generate (Oluştur) düğmesine tıklayın.
  7. Görüntülenen belirteci güvenli bir konuma kopyalayın ve bitti'ye tıklayın.

Not

Kopyalanan belirteci güvenli bir konuma kaydettiğinizden emin olun. Kopyalanan belirtecinizi başkalarıyla paylaşmayın. Kopyalanan belirteci kaybederseniz, tam olarak aynı belirteci yeniden oluşturamazsınız. Bunun yerine, yeni bir belirteç oluşturmak için bu yordamı yinelemeniz gerekir. Kopyalanan belirteci kaybederseniz veya belirtecin gizliliğinin ihlal edildiğini düşünüyorsanız Databricks, Erişim belirteçleri sayfasındaki belirtecin yanındaki çöp kutusu (İptal Et) simgesine tıklayarak bu belirteci çalışma alanınızdan hemen silmenizi kesinlikle önerir.

Çalışma alanınızda belirteç oluşturamıyor veya kullanamıyorsanız, bunun nedeni çalışma alanı yöneticinizin belirteçleri devre dışı bırakmış olması veya size belirteç oluşturma veya kullanma izni vermemiş olması olabilir. Çalışma alanı yöneticinize veya aşağıdaki konulara bakın:

Go için Databricks SQL Sürücüsünün kimliğini bir DSN bağlantı dizesi ve DSN bağlantı dizesi ile 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> gereksinimlerinizden Azure Databricks kişisel erişim belirtecinizdir.
  • <server-hostname> , gereksinimlerden Sunucu Ana Bilgisayar Adı değeridir.
  • <port-number>, genellikle 443olan gereksinimlerden bağlantı noktası değeridir.
  • <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 doğrulamak için aşağıdaki kod parçacığını ve Aşağıdaki ortam değişkenlerini ayarladığınızı varsayan NewConnector işleviyle 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ı için Azure CLI'yı kullanabilirsiniz. Bkz . Azure CLI kullanarak kullanıcılar için Microsoft Entra ID belirteçlerini alma.

    • Microsoft Entra ID hizmet sorumlusu için bkz . Azure CLI ile Microsoft Entra ID erişim belirteci alma. Microsoft Entra Id yönetilen hizmet sorumlusu oluşturmak için bkz . Hizmet sorumlularını yönetme.

    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ı dizesi ve DSN bağlantı dizesi ile 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>, genellikle 443olan gereksinimlerden bağlantı noktası değeridir.
    • <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 doğrulamak için aşağıdaki kod parçacığını ve Aşağıdaki ortam değişkenlerini ayarladığınızı varsayan NewConnector işleviyle 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ögesini Microsoft Entra ID belirtecinize 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ı dizesi ve DSN bağlantı dizesi ile bağlanma'daki kod örneğini 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>, genellikle 443olan gereksinimlerden bağlantı noktası değeridir.
  • <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ün NewConnector kimliğini doğrulamak için önce bildiriminize import 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 NewConnector işleviyle 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 makineden makineye (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 sorumlusu oluşturun ve bu hizmet sorumlusu için bir OAuth gizli dizisi oluşturun.

    Hizmet sorumlusunu ve OAuth gizli dizisini oluşturmak için bkz . OAuth (OAuth M2M) kullanarak hizmet sorumlusuyla Azure Databricks'e erişimin kimliğini doğrulama. Hizmet sorumlusunun UUID veya Uygulama Kimliği değerini ve hizmet sorumlusunun OAuth gizli dizisi için Gizli dizi 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ı dizesi ve DSN bağlantı dizesi ile 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>, genellikle 443olan gereksinimlerden bağlantı noktası değeridir.
  • <http-path> , gereksinimlerden http yolu değeridir.
  • <client-id> hizmet sorumlusunun UUID veya Uygulama Kimliği değeridir.
  • <client-secret>, hizmet sorumlusunun OAuth gizli dizisinin Gizli dizi 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 SQL Sürücüsünün NewConnector kimliğini doğrulamak için önce bildiriminize import aşağıdakileri 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 NewConnector işleviyle 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 sorumlusunun OAuth gizli dizisi için Gizli dizi 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 nyctaxi şemasındaki tablodan trips samples ilk iki satırı döndürür.

Bu kod örneği, adlı DATABRICKS_DSNbir ortam değişkeninden DSN bağlantı dizesi 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()
}

Günlük Kaydı

Go için Databricks SQL Sürücüsünün yaydığı iletileri günlüğe kaydetmek için kullanın github.com/databricks/databricks-sql-go/logger . Aşağıdaki kod örneği, DSN bağlantı dizesi aracılığıyla veritabanı tanıtıcısı oluşturmak için kullanırsql.Open(). Bu kod örneği, adlı DATABRICKS_DSNbir ortam değişkeninden DSN bağlantı dizesi alır. Düzeyinde ve altında yayılan debug tüm günlük iletileri dosyaya results.log 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 sanal koşullar altında test etmek için testfify gibi sahte kitaplıklara gidin.

Örneğin, Azure Databricks çalışma alanı bağlantısını döndüren bir GetDBWithDSNPAT işlev içeren adlı aşağıdaki dosyahelpers.go, kataloğun nyctaxi şemasındaki samples tablodan trips veri döndüren bir GetNYCTaxiTrips 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 " + 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)
  }
}

Ve bu işlevleri çağıran adlı main.go aşağıdaki 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 nesneyle dalga geçer. Test ayrıca şemaya ve gerçek verilerdeki değerlere uyan bazı verilerle dalga geçer. 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 İşlev bir SELECT deyim içerdiğinden ve bu nedenle tablonun durumunu trips değiştirmediğinden, bu örnekte sahte işlem yapmak kesinlikle gerekli değildir. Ancak sahte işlem, çalışma alanıyla gerçek bir bağlantının yapılmasını beklemeden testlerinizi hızlı bir şekilde çalıştırmanızı sağlar. Ayrıca sahte işlem, bir tablonun durumunu değiştirebilecek , UPDATEve DELETE FROMgibi INSERT INTOişlevler için simülasyon testlerini birden çok kez çalıştırmanıza olanak tanır.

Ek kaynaklar