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
- Langganan Azure - membuat secara gratis.
- Go yang terpasang: Versi 1.17 atau di atasnya
- Azure CLI
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:
Buat grup sumber daya Azure.
az group create --name myResourceGroup --location eastus
Selanjutnya, buat akun Azure Storage untuk Azure Table baru Anda.
az storage account create --name <storageAccountName> --resource-group myResourceGroup --location eastus --sku Standard_LRS
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.
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk