Databricks SQL meghajtó Go-hoz

A Databricks SQL Driver for Go egy Go-kódtár , amely lehetővé teszi, hogy Go-kód használatával SQL-parancsokat futtasson az Azure Databricks számítási erőforrásain. Ez a cikk kiegészíti a Databricks SQL-illesztőprogramot a Go README-hez, az API-referenciákat és példákat.

Követelmények

A Databricks SQL Driver for Go használatának első lépései

  1. A fejlesztői gépén, ahol már Go 1.20 vagy újabb verzió van telepítve, és ahol már van egy meglévő Go-kódprojekt létrehozva, hozzon létre egy go.mod fájlt a Go-kód függőségeinek nyomon követéséhez a go mod init parancs futtatásával, például:

    go mod init sample
    
  2. A Databricks SQL Driver for Go csomaggal való függőséget úgy tudod beállítani, hogy futtatod a go mod edit -require parancsot, a Databricks SQL Driver for Go csomag legújabb verziójára cserélve v1.5.2, ahogyan a Kiadások alatt felsoroltak szerint szerepel.

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

    A go.mod fájlnak így kell kinéznie:

    module sample
    
    go 1.20
    
    require github.com/databricks/databricks-sql-go v1.5.2
    
  3. A projektben hozzon létre egy Go-kódfájlt, amely importálja a Databricks SQL Driver for Go-t. Az alábbi példa egy main.go nevű fájlban, a következő tartalommal, felsorolja az Azure Databricks-munkaterület összes fürtjét.

    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. Adja hozzá a hiányzó modulfüggőségeket a go mod tidy parancs futtatásával:

    go mod tidy
    

    Megjegyzés

    Ha megjelenik a hiba go: warning: "all" matched no packages, elfelejtette hozzáadni a Databricks SQL Driver for Go-t importáló Go-kódfájlt.

  5. Készítsen másolatot a modulban lévő main csomagok buildjeinek és tesztjeinek támogatásához szükséges összes csomagról a go mod vendor parancs futtatásával:

    go mod vendor
    
  6. Szükség szerint módosítsa a kódot az DATABRICKS_DSN Azure Databricks-hitelesítés környezeti változójának beállításához. Lásd még: Csatlakozás a DSN-kapcsolati sztringhez.

  7. Futtassa Go-kódfájlját, feltéve, hogy van egy main.go nevű fájlja, a go run parancs futtatásával.

    go run main.go
    
  8. Ha nem ad vissza hibát, sikeresen hitelesítette a Databricks SQL Driver for Go-t az Azure Databricks-munkaterülettel, és csatlakozott a munkaterületen futó Azure Databricks-fürthöz vagy SQL Warehouse-hoz.

Csatlakozás DSN sztring kapcsolattal

Fürtök és SQL állomások eléréséhez használja a sql.Open()-t adatbázis-kezelő létrehozására egy adatforrásnév (DSN) kapcsolati sztringen keresztül. Ez a példakód lekéri a DSN-kapcsolati karakterláncot a DATABRICKS_DSN nevű környezeti változóból.

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

A DSN-kapcsolati sztring helyes formátumban történő megadásához tekintse meg a DSN kapcsolati sztring példákat a hitelesítésben. Az Azure Databricks személyes hozzáférési jogkivonatának hitelesítéséhez például használja a következő szintaxist, ahol:

  • <personal-access-token> Az Azure Databricks személyes hozzáférési jogkivonata a követelményekből.
  • <server-hostname> a kiszolgáló hosztnév értéke a követelményekből.
  • <port-number> a követelmények portértéke , amely általában 443.
  • <http-path> a követelmények http-elérési útvonalának értéke.
  • <paramX=valueX>A cikk későbbi részében felsorolt egy vagy több választható paraméter.
token:<personal-access-token>@<server-hostname>:<port-number>/<http-path>?<param1=value1>&<param2=value2>

Például egy fürt esetében:

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

Például egy SQL-raktár esetében:

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

Megjegyzés

Ajánlott biztonsági gyakorlatként ne ágyazza be ezt a DSN kapcsolati sor a Go-kódba. Ehelyett le kell kérnie a DSN-kapcsolat karakterláncát egy biztonságos helyről. A cikk korábbi példakódja például egy környezeti változót használt.

Választható paraméterek

  • A támogatott választható kapcsolati paraméterek a következőben <param=value>adhatók meg: . A leggyakrabban használtak közé tartoznak a következők:
    • catalog: Beállítja a kezdeti katalógusnevet a munkamenetben.
    • schema: Beállítja a kezdeti sémanevet a munkamenetben.
    • maxRows: Beállítja a kérésenként lekért sorok maximális számát. Az alapértelmezett érték 10000.
    • timeout: Hozzáadja a kiszolgálói lekérdezés végrehajtásához szükséges időtúllépést (másodpercben). Az alapértelmezett érték időkorlát nélkül.
    • userAgentEntry: Partnerek azonosítására szolgál. További információkért tekintse meg a partner dokumentációját.
  • A támogatott opcionális munkamenetparaméterek a következőben param=valueadhatók meg: A leggyakrabban használtak közé tartoznak a következők:
    • ansi_mode: Logikai karaktersorozat. true munkamenet-utasításoknak, hogy betartsák az ANSI SQL-specifikációban meghatározott szabályokat. A rendszer alapértelmezése hamis.
    • timezone: Karakterlánc, például America/Los_Angeles. Beállítja a munkamenet időzónáját. A rendszer alapértelmezett értéke UTC.
    • query_tags: Egy olyan vesszővel tagolt kulcs:érték párok szabályos karakterlánca, amely SQL-lekérdezésekhez csatolható a nyomon követés érdekében system.query.history, például team:engineering,dashboard:abc123. Ez a funkció nyilvános előzetes verzióban van.

Például egy SQL-raktár esetében:

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

Csatlakozás a NewConnector függvényhez

Azt is megteheti, hogy egy sql.OpenDB() használatával új összekötő objektumon dbsql.NewConnector() keresztül hoz létre adatbázis-kezelőt (új összekötő objektummal rendelkező Azure Databricks-fürtökhöz és SQL-tárházakhoz való csatlakozáshoz a Databricks SQL Driver for Go 1.0.0-s vagy újabb verziója szükséges). Példa:

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

A megfelelő beállításkészlet NewConnector megadásához tekintse meg a hitelesítés példáit.

Megjegyzés

Biztonsági ajánlott eljárásként ne írja be a NewConnector beállításokat a Go-kódba. Ehelyett ezeket az értékeket biztonságos helyről kell lekérnie. Az előző kód például környezeti változókat használ.

A leggyakrabban használt funkcionális lehetőségek közé tartoznak a következők:

  • WithAccessToken(<access-token>): Az Azure Databricks személyes hozzáférési tokenje a követelmények szerint. Kötelező string.
  • WithServerHostname(<server-hostname>): A szerver hosztnév értéke a követelmények szerint. Kötelező string.
  • WithPort(<port>): A kiszolgáló portszáma általában 443. Kötelező int.
  • WithHTTPPath(<http-path>): A http-elérési út értéke a követelményekből. Kötelező string.
  • WithInitialNamespace(<catalog>, <schema>):A katalógus és a séma neve a munkamenetben. Nem kötelezőstring, string.
  • WithMaxRows(<max-rows>): A lekért sorok maximális száma kérésenként. Az alapértelmezett a 10000. választható int.
  • WithSessionParams(<params-map>): A munkamenet paraméterei, beleértve az "időzónát", a "ansi_mode" és a "query_tags" paramétert. Nem kötelezőmap[string]string.
  • WithTimeout(<timeout>). A kiszolgálói lekérdezés végrehajtásának időtúllépése (in time.Duration) Az alapértelmezett érték időkorlát nélkül. Opcionális.
  • WithUserAgentEntry(<isv-name-plus-product-name>). Partnerek azonosítására szolgál. További információkért tekintse meg a partner dokumentációját. Nem kötelezőstring.

Példa:

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

Hitelesítés

A Databricks SQL Driver for Go a következő Azure Databricks-hitelesítési típusokat támogatja:

A Databricks SQL Driver for Go még nem támogatja a következő Azure Databricks-hitelesítési típusokat:

Databricks személyes hozzáférési jogkivonat hitelesítése

A Databricks SQL Driver for Go Azure Databricks személyes hozzáférési jogkivonat-hitelesítéssel való használatához először létre kell hoznia egy Azure Databricks személyes hozzáférési jogkivonatot. A lépés részleteiért lásd: Személyes hozzáférési jogkivonatok létrehozása munkaterület-felhasználók számára.

A Databricks SQL Driver for Go DSN-kapcsolati karakterlánc és a DSN kapcsolat karakterlánc példájának kódja hitelesítéséhez használja a következő DSN-kapcsolati karakterlánc szintaxisát, ahol:

  • <personal-access-token> Az Azure Databricks személyes hozzáférési jogkivonata a követelményekből.
  • <server-hostname> a kiszolgáló hosztnév értéke a követelményekből.
  • <port-number> a követelmények portértéke , amely általában 443.
  • <http-path> a követelmények http-elérési útvonalának értéke.

Hozzáfűzhet egy vagy több választható paramétert is a cikkben korábban felsoroltakhoz.

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

A Databricks SQL Driver for Go függvénysel való NewConnector hitelesítéséhez használja a következő kódrészletet és a Connect with the NewConnector function kódpéldát, amely feltételezi, hogy a következő környezeti változókat állította be:

  • Állítsa be a DATABRICKS_SERVER_HOSTNAMEkomponenst a szerver hosztnév értékére a fürt vagy az SQL tárház számára.
  • DATABRICKS_HTTP_PATH, állítsa be HTTP-elérési út értékét a fürt vagy SQL-adattárház számára.
  • DATABRICKS_TOKEN, állítsa be az Azure Databricks személyes hozzáférési tokenre.

A környezeti változók beállításához tekintse meg az operációs rendszer dokumentációját.

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 token hitelesítése

A Databricks SQL Driver for Go támogatja a Microsoft Entra ID-jogkivonatokat egy Azure Databricks-felhasználóhoz vagy egy Microsoft Entra ID szolgáltatásnévhez.

Microsoft Entra ID hozzáférési jogkivonat létrehozásához tegye a következőket:

  • Azure Databricks-felhasználó vagy Microsoft Entra ID szolgáltatási fő azonosító esetén használja az Azure CLI-t. Lásd: Microsoft Entra ID-jogkivonatok manuális beszerzése. A Microsoft Entra ID által felügyelt szolgáltatásnév létrehozásához tekintse meg a szolgáltatásnevek című témakört.

    A Microsoft Entra ID-jogkivonatok alapértelmezett élettartama körülbelül 1 óra. Új Microsoft Entra ID-jogkivonat létrehozásához ismételje meg ezt a folyamatot.

    A Databricks SQL Driver for Go hitelesítéséhez egy DSN-kapcsolati sztringgel, valamint a Connect with a DSN connection string kódpéldájával, használja a következő DSN-kapcsolati sztring szintaxist, ahol:

    • <microsoft-entra-id-token> A Microsoft Entra ID-jogkivonata.
    • <server-hostname> A követelményekből származó kiszolgáló hosztnevének értéke.
    • <port-number> a követelmények portértéke , amely általában 443.
    • <http-path> a követelmények http-elérési útvonalának értéke.

    Hozzáfűzhet egy vagy több választható paramétert is a cikkben korábban felsoroltakhoz.

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

    A Databricks SQL Driver for Go függvénysel való NewConnector hitelesítéséhez használja a következő kódrészletet és a Connect with the NewConnector function kódpéldát, amely feltételezi, hogy a következő környezeti változókat állította be:

    • Állítsa be a DATABRICKS_SERVER_HOSTNAMEkomponenst a szerver hosztnév értékére a fürt vagy az SQL tárház számára.
    • DATABRICKS_HTTP_PATH, állítsa be HTTP-elérési út értékét a fürt vagy SQL-adattárház számára.
    • DATABRICKS_TOKEN, állítsa be a Microsoft Entra ID-jogkivonatára.

    A környezeti változók beállításához tekintse meg az operációs rendszer dokumentációját.

    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 user-to-machine (U2M) hitelesítés

A Databricks SQL Driver for Go 1.5.0-s és újabb verziói támogatják az OAuth felhasználó–gép (U2M) hitelesítést.

A Databricks SQL Driver for Go használatához egy DSN-kapcsolati sztringgel, valamint a DSN-kapcsolati sztringgel való kapcsolódás kód példájával, használja a következő DSN-kapcsolati sztring szintaxist, ahol:

  • <server-hostname> A követelményekből a szerver hosztnév értéke.
  • <port-number> a követelmények portértéke , amely általában 443.
  • <http-path> a követelmények http-elérési útvonalának értéke.

Hozzáfűzhet egy vagy több választható paramétert is a cikkben korábban felsoroltakhoz.

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

A Databricks SQL Driver for Go függvénysel való NewConnector hitelesítéséhez először a következőket kell hozzáadnia a import deklarációhoz:

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

Ezután használja a következő kódrészletet és a kódpéldát a Connect with the NewConnector függvényben, amely feltételezi, hogy a következő környezeti változókat állította be:

  • Állítsa be a DATABRICKS_SERVER_HOSTNAMEkomponenst a szerver hosztnév értékére a fürt vagy az SQL tárház számára.
  • DATABRICKS_HTTP_PATH, állítsa be HTTP-elérési út értékét a fürt vagy SQL-adattárház számára.

A környezeti változók beállításához tekintse meg az operációs rendszer dokumentációját.

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 gép-gép közötti (M2M) hitelesítés

A Databricks SQL Driver for Go 1.5.2-es és újabb verziói támogatják az OAuth machine-to-machine (M2M) hitelesítést.

A Databricks SQL Driver for Go OAuth M2M-hitelesítéssel való használatához a következőket kell tennie:

  1. Hozzon létre egy Azure Databricks-szolgáltatásnevet az Azure Databricks-munkaterületen, és hozzon létre egy OAuth-titkos kulcsot a szolgáltatásnévhez.

    A szolgáltatásnév és az OAuth-titkos kód létrehozásához lásd: Szolgáltatásnév hozzáférésének engedélyezése az Azure Databrickshez az OAuth használatával. Jegyezze fel a szolgáltatásnév UUID - vagy alkalmazásazonosító-értékét , valamint a szolgáltatásnév OAuth-titkos kódjának titkos értékét.

  2. Adjon hozzáférést a szolgáltatásfőnöknek a fürthöz vagy a raktárhoz.

    Ha hozzáférést szeretne adni a szolgáltatásfőelnek a fürthöz vagy az adattárházhoz, tekintse meg a számítási engedélyek vagy az SQL adattárház kezelésének részleteit.

A Databricks SQL Driver for Go DSN-kapcsolati karakterlánc és a DSN kapcsolat karakterlánc példájának kódja hitelesítéséhez használja a következő DSN-kapcsolati karakterlánc szintaxisát, ahol:

  • <server-hostname> a kiszolgáló hosztnév értéke a követelményekből.
  • <port-number> a követelmények portértéke , amely általában 443.
  • <http-path> a követelmények http-elérési útvonalának értéke.
  • <client-id> a szolgáltatás objektumának UUID- vagy alkalmazásazonosító-értéke.
  • <client-secret> A szolgáltatásfelelős OAuth titkos értéke.

Hozzáfűzhet egy vagy több választható paramétert is a cikkben korábban felsoroltakhoz.

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

A Databricks SQL Driver for Go függvénysel való NewConnector hitelesítéséhez először a következőket kell hozzáadnia a import deklarációhoz:

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

Ezután használja a következő kódrészletet és a kódpéldát a Connect with the NewConnector függvényben, amely feltételezi, hogy a következő környezeti változókat állította be:

  • Állítsa be a DATABRICKS_SERVER_HOSTNAMEkomponenst a szerver hosztnév értékére a fürt vagy az SQL tárház számára.
  • DATABRICKS_HTTP_PATH, állítsa be HTTP-elérési út értékét a fürt vagy SQL-adattárház számára.
  • DATABRICKS_CLIENT_ID, állítsa be a szolgáltatás főképviselőjének UUID - vagy alkalmazásazonosítóját.
  • DATABRICKS_CLIENT_SECRET, állítsa be a szolgáltatásnév OAuth-titkos kódjának titkos értékét.

A környezeti változók beállításához tekintse meg az operációs rendszer dokumentációját.

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

Adatok lekérdezése

Az alábbi példakód bemutatja, hogyan hívhatja meg a Databricks SQL Driver for Go-t egy alapszintű SQL-lekérdezés futtatásához egy Azure Databricks számítási erőforráson. Ez a parancs a trips katalógus samples sémájának nyctaxi táblázatából adja vissza az első két sort.

Ez a példakód lekéri a DSN-kapcsolati sztringet egy megnevezett DATABRICKS_DSNkörnyezeti változóból.

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

Fájlok kezelése Unity Catalog-kötetekben

A Databricks SQL-illesztővel helyi fájlokat írhat a Unity Catalog-kötetekbe, fájlokat tölthet le kötetekről, és fájlokat törölhet a kötetekből, ahogyan az alábbi példában látható:

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

Naplózás

A Databricks SQL Driver for Go által kibocsátott üzenetek naplózására használható github.com/databricks/databricks-sql-go/logger . Az alábbi példakód egy adatbázis-kezelő DSN-kapcsolati sztring keresztüli létrehozására szolgálsql.Open(). Ez a példakód lekéri a DSN kapcsolati karakterláncot egy DATABRICKS_DSN nevű környezeti változóból. Minden, az debug adott szinten és alatt kibocsátott naplóüzenet a results.log fájlba lesz írva.

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

Tesztelés

A kód teszteléséhez használja a Go tesztelési keretrendszereket, például a tesztelési standard kódtárat. Ha szimulált körülmények között szeretné tesztelni a kódot az Azure Databricks REST API-végpontok meghívása vagy az Azure Databricks-fiókok vagy -munkaterületek állapotának módosítása nélkül, használja a Go-kódtárakat, például a testfify-et.

Ha például a következő fájl neve helpers.go egy GetDBWithDSNPAT Azure Databricks-munkaterületi kapcsolatot visszaadó függvényt tartalmaz, egy GetNYCTaxiTrips függvény, amely adatokat ad vissza a tripssamples katalógus sémájában nyctaxi lévő táblából, és a PrintNYCTaxiTrips visszaadott adatokat kinyomtatja:

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

És adott a következő fájl, amelynek neve main.go, ami meghívja ezeket a függvényeket:

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

A következő elnevezett helpers_test.go fájl ellenőrzi, hogy a GetNYCTaxiTrips függvény a várt választ adja-e vissza. Ahelyett, hogy valódi kapcsolatot hoz létre a cél-munkaterülethez, ez a teszt egy sql.DB objektumot szimulál. A teszt néhány olyan adatot is szimulál, amely megfelel a valós adatok sémájának és értékeinek. A teszt a szimulált kapcsolaton keresztül adja vissza a szimulált adatokat, majd ellenőrzi, hogy a szimulált adatsorok egyik értéke megegyezik-e a várt értékkel.

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

Mivel a GetNYCTaxiTrips függvény egy SELECT utasítást tartalmaz, és ezért nem változtatja meg a trips tábla állapotát, ebben a példában nem feltétlenül szükséges a mockolás. A gúnyolással azonban gyorsan futtathatja a teszteket anélkül, hogy tényleges kapcsolatra kellene várnia a munkaterülettel. A tesztelési módszerek lehetővé teszik, hogy szimulált teszteket többször is futtasson olyan függvények esetében, amelyek megváltoztathatják egy tábla állapotát, mint például INSERT INTO, UPDATE és DELETE FROM.

További erőforrások