Verwenden des Azure SDK für Go mit Azure Table
GILT FÜR: Tabelle
Tipp
Der Inhalt in diesem Artikel gilt für Azure Table Storage und Azure Cosmos DB for Table. Die API for Table ist ein Premiumangebot für Tabellenspeicher und bietet Tabellen mit optimiertem Durchsatz, globale Verteilung und automatische sekundäre Indizes.
In diesem Artikel erfahren Sie, wie Sie Azure Table-Instanzen und -Entitäten mit dem Azure SDK für Go erstellen, auflisten und löschen.
Azure Table ermöglicht das Speichern von strukturierten NoSQL-Daten in der Cloud, indem Ihnen ein Schlüsselattributspeicher mit schemalosem Design bereitgestellt wird. Aufgrund der Schemalosigkeit von Azure Table-Speicher ist es einfach, Ihre Daten an die Anforderungen Ihrer Anwendungen anzupassen. Der Zugriff auf die Daten und API der Tabelle ist eine schnelle und kostengünstige Lösung für viele Anwendungen.
Mit Azure Table-Speicher oder Azure Cosmos DB können Sie flexible Datasets wie Benutzerdaten für Webanwendungen, Adressbücher und Geräteinformationen speichern. Oder andere Arten von Metadaten, die Ihr Dienst erfordert. Sie können eine beliebige Anzahl von Entitäten in einer Tabelle speichern, und ein Speicherkonto kann eine beliebige Anzahl von Tabellen enthalten (bis zur Speicherkapazitätsgrenze eines Speicherkontos).
Folgen Sie diesem Artikel, um zu erfahren, wie Sie Azure Table-Speicher mithilfe des Azure SDK für Go verwalten.
Voraussetzungen
- Azure-Abonnement (kostenloses Abonnement erstellen)
- Installation von Go: Version 1.17 oder höher
- Azure-Befehlszeilenschnittstelle
Erstellen Ihrer Umgebung
Um diesem Lernprogramm zu folgen, benötigen Sie eine Azure-Ressourcengruppe, ein Speicherkonto und eine Tabellenressource. Führen Sie die folgenden Befehle aus, um Ihre Umgebung einzurichten:
Erstellen einer Azure-Ressourcengruppe.
az group create --name myResourceGroup --location eastus
Erstellen Sie als Nächstes ein Azure-Speicherkonto für Ihre neue Azure Table-Instanz.
az storage account create --name <storageAccountName> --resource-group myResourceGroup --location eastus --sku Standard_LRS
Erstellen Sie eine Tabellenressource.
az storage table create --account-name <storageAccountName> --account-key 'storageKey' --name mytable
Installieren von Paketen
Sie benötigen zwei Pakete, um Azure Table mit Go zu verwalten; azidentity und aztables. Das Paket azidentity
bietet Ihnen eine Möglichkeit, sich bei Azure zu authentifizieren. Und mithilfe der aztables
-Pakete können Sie die Tabellenressource in Azure verwalten. Führen Sie die folgenden Go-Befehle aus, um diese Pakete zu installieren:
go get github.com/Azure/azure-sdk-for-go/sdk/data/aztables
go get github.com/Azure/azure-sdk-for-go/sdk/azidentity
Weitere Informationen zu den Möglichkeiten, sich bei Azure zu authentifizieren, finden Sie unter Azure-Authentifizierung mit dem Azure SDK für Go.
Erstellen der Beispielanwendung
Nachdem Sie die Pakete installiert haben, erstellen Sie eine Beispielanwendung, die das Azure SDK für Go zum Verwalten von Azure Table verwendet. Führen Sie den Befehl go mod
aus, um ein neues Modul namens azTableSample
zu erstellen.
go mod init azTableSample
Erstellen Sie als Nächstes eine Datei namens main.go
, und kopieren Sie es dann Folgendes in diese Datei:
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)
}
Wichtig
Stellen Sie sicher, dass das Konto, mit dem Sie sich authentifiziert haben, über die richtige Zugriffsrichtlinie verfügt, um Ihr Azure-Speicherkonto zu verwalten. Wenn Sie den oben stehenden Code ausführen möchten, müssen Sie mindestens über die Rollen „Mitwirkender an Storage-Blobdaten“ und „Mitwirkender an Storage-Tabellendaten“ verfügen.
Codebeispiele
Authentifizieren des Clients
// 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)
}
Erstellen einer Tabelle
// Create a table and discard the response
_, err := client.Create(context.TODO(), nil)
if err != nil {
panic(err)
}
Erstellen einer Entität
// 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)
}
Abrufen einer Entität
// 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)
}
}
Löschen einer Entität
_, err := client.DeleteEntity(context.TODO(), "pk001", "rk001", nil)
if err != nil {
panic(err)
}
Löschen einer Tabelle
_, err := client.Delete(context.TODO(), nil)
if err != nil {
panic(err)
}
Ausführen des Codes
Jetzt muss die Anwendung nur noch ausgeführt werden. Bevor Sie dies tun, müssen Sie jedoch Ihre Umgebungsvariablen einrichten. Erstellen Sie zwei Umgebungsvariablen, und legen Sie sie mithilfe der folgenden Befehle auf die entsprechenden Werte fest:
export AZURE_STORAGE_ACCOUNT=<YourStorageAccountName>
export AZURE_TABLE_NAME=<YourAzureTableName>
Führen Sie als Nächstes den folgenden go run
-Befehl aus, um die App auszuführen:
go run main.go
Bereinigen von Ressourcen
Führen Sie die folgenden Befehle aus, um die Ressourcengruppe und alle dazugehörigen Ressourcen zu löschen:
az group delete --resource-group myResourceGroup
Nächste Schritte
In diesem Schnellstart haben Sie gelernt, wie Sie ein Azure Cosmos DB-Konto erstellen, eine Tabelle mit dem Daten-Explorer erstellen und eine App ausführen. Jetzt können Sie Ihre Daten mithilfe der API für Table abfragen.