Bagikan melalui


Cara menggunakan Azure SDK for Go menggunakan Azure Table

BERLAKU UNTUK: Meja

Tip

Konten dalam artikel ini berlaku untuk penyimpanan Azure Table dan Azure Cosmos DB for Table. API untuk Tabel adalah penawaran premium untuk penyimpanan tabel yang menawarkan tabel yang dioptimalkan throughput, distribusi global, dan indeks sekunder otomatis.

Dalam artikel ini, Anda akan mempelajari cara untuk membuat, mencantumkan, dan menghapus entitas Tabel serta Azure Table dengan Azure SDK for Go.

Azure Table memungkinkan Anda untuk menyimpan data NoSQL terstruktur di cloud dengan cara memberi Anda penyimpanan atribut kunci dengan desain tanpa skema. Karena penyimpanan Azure Table tidak memiliki skema, mudah untuk menyesuaikan data Anda seiring dengan berkembangnya aplikasi Anda. Akses ke data tabel serta API adalah solusi yang tercepat dan paling hemat biaya untuk banyak aplikasi.

Anda dapat menggunakan penyimpanan Tabel atau Azure Cosmos DB untuk menyimpan kumpulan data fleksibel seperti data pengguna untuk aplikasi web, buku alamat, informasi perangkat. Ataupun jenis metadata lain yang diperlukan layanan Anda. Anda dapat menyimpan sejumlah entitas dalam tabel, dan akun penyimpanan dapat berisi sejumlah tabel, hingga batas kapasitas akun penyimpanan.

Ikuti artikel ini guna mempelajari cara mengelola penyimpanan Azure Table menggunakan Azure SDK for Go.

Prasyarat

Menyiapkan lingkungan Anda

Untuk mengikuti tutorial ini, Anda memerlukan grup sumber daya Azure, akun penyimpanan, serta sumber daya tabel. Jalankan perintah berikut ini untuk menyiapkan lingkungan Anda:

  1. Buat grup sumber daya Azure.

    az group create --name myResourceGroup --location eastus
    
  2. Selanjutnya, buat akun Azure Storage untuk Azure Table baru Anda.

    az storage account create --name <storageAccountName> --resource-group myResourceGroup --location eastus --sku Standard_LRS
    
  3. Membuat sumber daya tabel.

    az storage table create --account-name <storageAccountName> --account-key 'storageKey' --name mytable
    

Memasang paket

Anda membutuhkan dua paket untuk mengelola Azure Table dengan Go; azidentity dan aztable. Paket azidentity ini akan menyediakan cara untuk mengautentikasi ke Azure. Dan paket aztables menyediakan kemampuan untuk mengelola sumber daya tabel di Azure. Jalankan perintah Go berikut guna memasang paket ini:

go get github.com/Azure/azure-sdk-for-go/sdk/data/aztables
go get github.com/Azure/azure-sdk-for-go/sdk/azidentity

Untuk mempelajari selengkapnya mengenai metode autentikasi yang berbeda, lihat Autentikasi Azure dengan Azure SDK untuk Go.

Membuat aplikasi contoh

Setelah paket terinstal, Anda harus membuat aplikasi sampel yang menggunakan Azure SDK for Go guna mengelola Azure Table. Jalankan perintah go mod untuk membuat modul baru bernama azTableSample.

go mod init azTableSample

Selanjutnya, buat file bernama main.go, lalu salin kode berikut ini ke dalamnya:

package main

import (
    "context"
    "encoding/json"
    "fmt"
    "os"

    "github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
    "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
    "github.com/Azure/azure-sdk-for-go/sdk/data/aztables"
)

type InventoryEntity struct {
    aztables.Entity
    Price       float32
    Inventory   int32
    ProductName string
    OnSale      bool
}

type PurchasedEntity struct {
    aztables.Entity
    Price float32
    ProductName string
    OnSale bool
}

func getClient() *aztables.Client {
    accountName, ok := os.LookupEnv("AZURE_STORAGE_ACCOUNT")
    if !ok {
        panic("AZURE_STORAGE_ACCOUNT environment variable not found")
    }

    tableName, ok := os.LookupEnv("AZURE_TABLE_NAME")
    if !ok {
        panic("AZURE_TABLE_NAME environment variable not found")
    }

    cred, err := azidentity.NewDefaultAzureCredential(nil)
    if err != nil {
        panic(err)
    }
    serviceURL := fmt.Sprintf("https://%s.table.core.windows.net/%s", accountName, tableName)
    client, err := aztables.NewClient(serviceURL, cred, nil)
    if err != nil {
        panic(err)
    }
    return client
}

func createTable(client *aztables.Client) {
    //TODO: Check access policy, Storage Blob Data Contributor role needed
    _, err := client.Create(context.TODO(), nil)
    if err != nil {
        panic(err)
    }
}

func addEntity(client *aztables.Client) {
    myEntity := InventoryEntity{
        Entity: aztables.Entity{
            PartitionKey: "pk001",
            RowKey:       "rk001",
        },
        Price:       3.99,
        Inventory:   20,
        ProductName: "Markers",
        OnSale:      false,
    }

    marshalled, err := json.Marshal(myEntity)
    if err != nil {
        panic(err)
    }

    _, err = client.AddEntity(context.TODO(), marshalled, nil) // TODO: Check access policy, need Storage Table Data Contributor role
    if err != nil {
        panic(err)
    }
}

func listEntities(client *aztables.Client) {
    listPager := client.List(nil)
    pageCount := 0
    for listPager.More() {
        response, err := listPager.NextPage(context.TODO())
        if err != nil {
            panic(err)
        }
        fmt.Printf("There are %d entities in page #%d\n", len(response.Entities), pageCount)
        pageCount += 1
    }
}

func queryEntity(client *aztables.Client) {
    filter := fmt.Sprintf("PartitionKey eq '%v' or RowKey eq '%v'", "pk001", "rk001")
    options := &aztables.ListEntitiesOptions{
        Filter: &filter,
        Select: to.StringPtr("RowKey,Price,Inventory,ProductName,OnSale"),
        Top:    to.Int32Ptr(15),
    }

    pager := client.List(options)
    for pager.More() {
        resp, err := pager.NextPage(context.Background())
        if err != nil {
            panic(err)
        }
        for _, entity := range resp.Entities {
            var myEntity PurchasedEntity 
            err = json.Unmarshal(entity, &myEntity)
            if err != nil {
                panic(err)
            }
            fmt.Println("Return custom type [PurchasedEntity]")
            fmt.Printf("Price: %v; ProductName: %v; OnSale: %v\n", myEntity.Price, myEntity.ProductName, myEntity.OnSale)
        }
    }
}

func deleteEntity(client *aztables.Client) {
    _, err := client.DeleteEntity(context.TODO(), "pk001", "rk001", nil)
    if err != nil {
        panic(err)
    }
}

func deleteTable(client *aztables.Client) {
    _, err := client.Delete(context.TODO(), nil)
    if err != nil {
        panic(err)
    }
}

func main() {

    fmt.Println("Authenticating...")
    client := getClient()

    fmt.Println("Creating a table...")
    createTable(client)

    fmt.Println("Adding an entity to the table...")
    addEntity(client)

    fmt.Println("Calculating all entities in the table...")
    listEntities(client)

    fmt.Println("Querying a specific entity...")
    queryEntity(client) 

    fmt.Println("Deleting an entity...")
    deleteEntity(client) 

    fmt.Println("Deleting a table...")
    deleteTable(client)
}

Penting

Pastikan bahwa akun yang diautentikasi memiliki kebijakan akses yang tepat untuk mengelola akun penyimpanan Azure Anda. Untuk menjalankan kode di atas, akun Anda perlu memiliki minimal peran Kontributor Data Blob Storage serta peran Kontributor Data Tabel Penyimpanan.

Contoh kode

Mengautentikasi klien

// Lookup environment variables
accountName, ok := os.LookupEnv("AZURE_STORAGE_ACCOUNT")
if !ok {
  panic("AZURE_STORAGE_ACCOUNT environment variable not found")
}

tableName, ok := os.LookupEnv("AZURE_TABLE_NAME")
if !ok {
  panic("AZURE_TABLE_NAME environment variable not found")
}

// Create a credential
cred, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
  panic(err)
}

// Create a table client
serviceURL := fmt.Sprintf("https://%s.table.core.windows.net/%s", accountName, tableName)
client, err := aztables.NewClient(serviceURL, cred, nil)
if err != nil {
  panic(err)
}

Buat tabel

// Create a table and discard the response
_, err := client.Create(context.TODO(), nil)
if err != nil {
  panic(err)
}

Membuat entitas

// Define the table entity as a custom type
type InventoryEntity struct {
    aztables.Entity
    Price       float32
    Inventory   int32
    ProductName string
    OnSale      bool
}

// Define the entity values
myEntity := InventoryEntity{
    Entity: aztables.Entity{
        PartitionKey: "pk001",
        RowKey:       "rk001",
    },
    Price:       3.99,
    Inventory:   20,
    ProductName: "Markers",
    OnSale:      false,
}

// Marshal the entity to JSON
marshalled, err := json.Marshal(myEntity)
if err != nil {
    panic(err)
}

// Add the entity to the table
_, err = client.AddEntity(context.TODO(), marshalled, nil) // needs Storage Table Data Contributor role
if err != nil {
    panic(err)
}

Mendapatkan entitas

// Define the new custom type
type PurchasedEntity struct {
    aztables.Entity
    Price       float32
    ProductName string
    OnSale      bool
}

// Define the query filter and options
filter := fmt.Sprintf("PartitionKey eq '%v' or RowKey eq '%v'", "pk001", "rk001")
options := &aztables.ListEntitiesOptions{
    Filter: &filter,
    Select: to.StringPtr("RowKey,Price,Inventory,ProductName,OnSale"),
    Top:    to.Int32Ptr(15),
}

// Query the table for the entity
pager := client.List(options)
for pager.More() {
    resp, err := pager.NextPage(context.Background())
    if err != nil {
        panic(err)
    }
    for _, entity := range resp.Entities {
        var myEntity PurchasedEntity
        err = json.Unmarshal(entity, &myEntity)
        if err != nil {
            panic(err)
        }
        fmt.Println("Return custom type [PurchasedEntity]")
        fmt.Printf("Price: %v; ProductName: %v; OnSale: %v\n", myEntity.Price, myEntity.ProductName, myEntity.OnSale)
    }
}

Menghapus entitas

_, err := client.DeleteEntity(context.TODO(), "pk001", "rk001", nil)
if err != nil {
  panic(err)
}

Menghapus tabel

_, err := client.Delete(context.TODO(), nil)
if err != nil {
  panic(err)
}

Menjalankan kode

Tinggal menjalankan aplikasi. Tetapi sebelum Anda melakukannya, Anda harus mengatur variabel lingkungan Anda. Buatlah dua variabel lingkungan dan atur ke nilai yang sesuai menggunakan perintah berikut:

export AZURE_STORAGE_ACCOUNT=<YourStorageAccountName> 
export AZURE_TABLE_NAME=<YourAzureTableName>

Jalankan perintah berikut go run untuk menjalankan aplikasi:

go run main.go

Membersihkan sumber daya

Jalankan perintah berikut untuk menghapus grup sumber daya dan semua sumber daya yang tersisa:

az group delete --resource-group myResourceGroup

Langkah berikutnya

Dalam mulai cepat ini, Anda telah mempelajari cara membuat akun Microsoft Azure Cosmos DB, membuat tabel menggunakan Data Explorer, dan menjalankan aplikasi. Sekarang Anda dapat mengkueri data Anda menggunakan API untuk Tabel.