Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Amazon QLDB Driver for Go — Tutoriel de démarrage rapide
Important
Avis de fin de support : les clients existants pourront utiliser Amazon QLDB jusqu'à la fin du support le 31 juillet 2025. Pour plus de détails, consultez Migrer un Amazon QLDB Ledger vers Amazon Aurora SQL Postgre
Dans ce didacticiel, vous apprendrez à configurer une application simple à l'aide de la dernière version du QLDB pilote Amazon pour Go. Ce guide inclut les étapes d'installation du pilote et des exemples de code abrégé des opérations de base de création, de lecture, de mise à jour et de suppression (CRUD).
Rubriques
- Prérequis
- Étape 1 : Installation du pilote
- Étape 2 : Importer les packages
- Étape 3 : Initialisation du pilote
- Étape 4 : Création d'une table et d'un index
- Étape 5 : Insérer un document
- Étape 6 : Interrogez le document
- Étape 7 : Mettre à jour le document
- Étape 8 : rechercher le document mis à jour
- Étape 9 : Déposez la table
- Exécution de l'application complète
Prérequis
Avant de commencer, assurez-vous d'effectuer les opérations suivantes :
-
Complétez le driver Prérequis for the Go, si ce n'est pas déjà fait. Cela inclut l'inscription AWS, l'octroi d'un accès programmatique pour le développement et l'installation de Go.
-
Créez un registre nommé
quick-start
.Pour savoir comment créer un registre, voir Opérations de base pour Amazon QLDB Ledgers ou Étape 1 : Création d'un nouveau registre dans Commencer à utiliser la console.
Étape 1 : Installation du pilote
Assurez-vous que votre projet utilise des modules Go
Dans le répertoire de votre projet, entrez la go get
commande suivante.
$
go get -u github.com/awslabs/amazon-qldb-driver-go/v3/qldbdriver
L'installation du pilote installe également ses dépendances, notamment les packages AWS SDK for Go v2
Étape 2 : Importer les packages
Importez les AWS packages suivants.
import ( "context" "fmt" "github.com/amzn/ion-go/ion" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/qldbSession" "github.com/awslabs/amazon-qldb-driver-go/v3/qldbdriver" )
Étape 3 : Initialisation du pilote
Initialisez une instance du pilote qui se connecte au registre nommé. quick-start
cfg, err := config.LoadDefaultConfig(context.TODO()) if err != nil { panic(err) } qldbSession := qldbsession.NewFromConfig(cfg, func(options *qldbsession.Options) { options.Region = "
us-east-1
" }) driver, err := qldbdriver.New( "quick-start", qldbSession, func(options *qldbdriver.DriverOptions) { options.LoggerVerbosity = qldbdriver.LogInfo }) if err != nil { panic(err) } defer driver.Shutdown(context.Background())
Note
Dans cet exemple de code, remplacez us-east-1
avec l' Région AWS
endroit où vous avez créé votre registre.
Étape 4 : Création d'une table et d'un index
L'exemple de code suivant montre comment exécuter CREATE TABLE
des CREATE
INDEX
instructions.
_, err = driver.Execute(context.Background(), func(txn qldbdriver.Transaction) (interface{}, error) { _, err := txn.Execute("CREATE TABLE People") if err != nil { return nil, err } // When working with QLDB, it's recommended to create an index on fields we're filtering on. // This reduces the chance of OCC conflict exceptions with large datasets. _, err = txn.Execute("CREATE INDEX ON People (firstName)") if err != nil { return nil, err } _, err = txn.Execute("CREATE INDEX ON People (age)") if err != nil { return nil, err } return nil, nil }) if err != nil { panic(err) }
Ce code crée une table nommée People
et indexe les age
champs firstName
et de cette table. Les index sont nécessaires pour optimiser les performances des requêtes et aider à limiter les exceptions de conflit optimistes en matière de contrôle de simultanéité (OCC).
Étape 5 : Insérer un document
Les exemples de code suivants montrent comment exécuter une INSERT
instruction. QLDBprend en charge le langage de requête partiQL (SQLcompatible) et le format de données Amazon Ion (surensemble de). JSON
Utilisation du littéral partiQL
Le code suivant insère un document dans le People
tableau à l'aide d'une instruction partiQL littérale sous forme de chaîne.
_, err = driver.Execute(context.Background(), func(txn qldbdriver.Transaction) (interface{}, error) { return txn.Execute("INSERT INTO People {'firstName': 'Jane', 'lastName': 'Doe', 'age': 77}") }) if err != nil { panic(err) }
Utilisation des types de données Ion
À l'instar du JSONpackage
-
Supposons que la structure Go suivante soit nommée
Person
.type Person struct { FirstName string `ion:"firstName"` LastName string `ion:"lastName"` Age int `ion:"age"` }
-
Créez une instance de
Person
.person := Person{"John", "Doe", 54}
Le pilote crée pour vous une représentation textuelle codée par ions de
person
.Important
Pour que marshal et unmarshal fonctionnent correctement, les noms de champs de la structure de données Go doivent être exportés (première lettre en majuscule).
-
Passez l'
person
instance à laExecute
méthode de la transaction._, err = driver.Execute(context.Background(), func(txn qldbdriver.Transaction) (interface{}, error) { return txn.Execute("INSERT INTO People ?", person) }) if err != nil { panic(err) }
Cet exemple utilise un point d'interrogation (
?
) comme espace réservé aux variables pour transmettre les informations du document à l'instruction. Lorsque vous utilisez des espaces réservés, vous devez transmettre une valeur de texte codée par ions.Astuce
Pour insérer plusieurs documents en utilisant une seule INSERT instruction, vous pouvez transmettre un paramètre de type list à l'instruction comme suit.
// people is a list txn.Execute("INSERT INTO People ?", people)
Vous ne placez pas la variable placeholder (
?
) entre crochets (<<...>>
) lorsque vous transmettez une liste. Dans les instructions partiQL manuelles, les crochets à double angle indiquent une collection non ordonnée appelée sac.
Étape 6 : Interrogez le document
L'exemple de code suivant montre comment exécuter une SELECT
instruction.
p, err := driver.Execute(context.Background(), func(txn qldbdriver.Transaction) (interface{}, error) { result, err := txn.Execute("SELECT firstName, lastName, age FROM People WHERE age = 54") if err != nil { return nil, err } // Assume the result is not empty hasNext := result.Next(txn) if !hasNext && result.Err() != nil { return nil, result.Err() } ionBinary := result.GetCurrentData() temp := new(Person) err = ion.Unmarshal(ionBinary, temp) if err != nil { return nil, err } return *temp, nil }) if err != nil { panic(err) } var returnedPerson Person returnedPerson = p.(Person) if returnedPerson != person { fmt.Print("Queried result does not match inserted struct") }
Cet exemple interroge votre document depuis le People
tableau, suppose que le jeu de résultats n'est pas vide et renvoie votre document à partir du résultat.
Étape 7 : Mettre à jour le document
L'exemple de code suivant montre comment exécuter une UPDATE
instruction.
person.Age += 10 _, err = driver.Execute(context.Background(), func(txn qldbdriver.Transaction) (interface{}, error) { return txn.Execute("UPDATE People SET age = ? WHERE firstName = ?", person.Age, person.FirstName) }) if err != nil { panic(err) }
Étape 8 : rechercher le document mis à jour
L'exemple de code suivant interroge la People
table par firstName
et renvoie tous les documents du jeu de résultats.
p, err = driver.Execute(context.Background(), func(txn qldbdriver.Transaction) (interface{}, error) { result, err := txn.Execute("SELECT firstName, lastName, age FROM People WHERE firstName = ?", person.FirstName) if err != nil { return nil, err } var people []Person for result.Next(txn) { ionBinary := result.GetCurrentData() temp := new(Person) err = ion.Unmarshal(ionBinary, temp) if err != nil { return nil, err } people = append(people, *temp) } if result.Err() != nil { return nil, result.Err() } return people, nil }) if err != nil { panic(err) } var people []Person people = p.([]Person) updatedPerson := Person{"John", "Doe", 64} if people[0] != updatedPerson { fmt.Print("Queried result does not match updated struct") }
Étape 9 : Déposez la table
L'exemple de code suivant montre comment exécuter une DROP TABLE
instruction.
_, err = driver.Execute(context.Background(), func(txn qldbdriver.Transaction) (interface{}, error) { return txn.Execute("DROP TABLE People") }) if err != nil { panic(err) }
Exécution de l'application complète
L'exemple de code suivant représente la version complète de l'application. Au lieu d'effectuer les étapes précédentes individuellement, vous pouvez également copier et exécuter cet exemple de code du début à la fin. Cette application montre certaines CRUD opérations de base sur le registre nomméquick-start
.
Note
Avant d'exécuter ce code, assurez-vous qu'aucune table active n'est déjà nommée People
dans le quick-start
registre.
package main import ( "context" "fmt" "github.com/amzn/ion-go/ion" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/qldbsession" "github.com/awslabs/amazon-qldb-driver-go/v2/qldbdriver" ) func main() { awsSession := session.Must(session.NewSession(aws.NewConfig().WithRegion("
us-east-1
"))) qldbSession := qldbsession.New(awsSession) driver, err := qldbdriver.New( "quick-start", qldbSession, func(options *qldbdriver.DriverOptions) { options.LoggerVerbosity = qldbdriver.LogInfo }) if err != nil { panic(err) } defer driver.Shutdown(context.Background()) _, err = driver.Execute(context.Background(), func(txn qldbdriver.Transaction) (interface{}, error) { _, err := txn.Execute("CREATE TABLE People") if err != nil { return nil, err } // When working with QLDB, it's recommended to create an index on fields we're filtering on. // This reduces the chance of OCC conflict exceptions with large datasets. _, err = txn.Execute("CREATE INDEX ON People (firstName)") if err != nil { return nil, err } _, err = txn.Execute("CREATE INDEX ON People (age)") if err != nil { return nil, err } return nil, nil }) if err != nil { panic(err) } _, err = driver.Execute(context.Background(), func(txn qldbdriver.Transaction) (interface{}, error) { return txn.Execute("INSERT INTO People {'firstName': 'Jane', 'lastName': 'Doe', 'age': 77}") }) if err != nil { panic(err) } type Person struct { FirstName string `ion:"firstName"` LastName string `ion:"lastName"` Age int `ion:"age"` } person := Person{"John", "Doe", 54} _, err = driver.Execute(context.Background(), func(txn qldbdriver.Transaction) (interface{}, error) { return txn.Execute("INSERT INTO People ?", person) }) if err != nil { panic(err) } p, err := driver.Execute(context.Background(), func(txn qldbdriver.Transaction) (interface{}, error) { result, err := txn.Execute("SELECT firstName, lastName, age FROM People WHERE age = 54") if err != nil { return nil, err } // Assume the result is not empty hasNext := result.Next(txn) if !hasNext && result.Err() != nil { return nil, result.Err() } ionBinary := result.GetCurrentData() temp := new(Person) err = ion.Unmarshal(ionBinary, temp) if err != nil { return nil, err } return *temp, nil }) if err != nil { panic(err) } var returnedPerson Person returnedPerson = p.(Person) if returnedPerson != person { fmt.Print("Queried result does not match inserted struct") } person.Age += 10 _, err = driver.Execute(context.Background(), func(txn qldbdriver.Transaction) (interface{}, error) { return txn.Execute("UPDATE People SET age = ? WHERE firstName = ?", person.Age, person.FirstName) }) if err != nil { panic(err) } p, err = driver.Execute(context.Background(), func(txn qldbdriver.Transaction) (interface{}, error) { result, err := txn.Execute("SELECT firstName, lastName, age FROM People WHERE firstName = ?", person.FirstName) if err != nil { return nil, err } var people []Person for result.Next(txn) { ionBinary := result.GetCurrentData() temp := new(Person) err = ion.Unmarshal(ionBinary, temp) if err != nil { return nil, err } people = append(people, *temp) } if result.Err() != nil { return nil, result.Err() } return people, nil }) if err != nil { panic(err) } var people []Person people = p.([]Person) updatedPerson := Person{"John", "Doe", 64} if people[0] != updatedPerson { fmt.Print("Queried result does not match updated struct") } _, err = driver.Execute(context.Background(), func(txn qldbdriver.Transaction) (interface{}, error) { return txn.Execute("DROP TABLE People") }) if err != nil { panic(err) } }