Controlador Amazon QLDB para Go — Tutorial de inicio rápido - Amazon Quantum Ledger Database (Amazon QLDB)

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Controlador Amazon QLDB para Go — Tutorial de inicio rápido

En este tutorial, aprenderá a configurar una aplicación sencilla mediante la última versión del controlador de Amazon QLDB para Go. Esta guía incluye los pasos para instalar el controlador y ejemplos de código corto decrear, leer, actualizar y eliminar(CRUD).

Requisitos previos

Antes de comenzar, asegúrese de que hace lo siguiente:

  1. Completar elRequisitos previospara el conductor de Go, si aún no lo ha hecho. Esto incluye inscribirse enAWS, obtener unAWSclave de acceso para desarrollo e instalación de Go.

  2. Crear un libro mayor dequick-start.

    Para obtener más información acerca de cómo crear un libro mayor, consulteOperaciones básicas para los libros mayores de Amazon QLDBoPaso 1: Creación de un libro de contabilidad nuevoenIntroducción a la consola.

Paso 1: Instalar el controlador

Asegúrese de que su proyecto utiliceMódulos Gopara instalar las dependencias del proyecto.

En el directorio de proyectos, escriba lo siguientego getcomando.

$ go get -u github.com/awslabs/amazon-qldb-driver-go/v3/qldbdriver

Al instalar el controlador, también se instalan sus dependencias, incluida laAWS SDK for Go v2yAmazon Ionpaquetes.

Paso 2: Importe los paquetes

Importe lo siguienteAWSpaquetes.

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

Paso 3: Inicializar el controlador

Inicializar una instancia del controlador que se conecta al libro mayor denominadoquick-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())
nota

En este ejemplo de código, sustituyaus-east-1conAWSRegión de en la que se ha creado el libro mayor.

Paso 4: Crear una tabla e índice

El siguiente ejemplo de ejemplo de ejemplo de código, cómo ejecutarCREATE TABLEyCREATE INDEXInstrucciones

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

Este ejemplo de código crea una tabla de denominadaPeople, e índices para elfirstNameyagecampos de esa tabla. Índicesson necesarios para optimizar el rendimiento de las consultas y ayudar a limitarcontrol de concurrencia (OCC) optimistaexcepciones de conflicto.

Paso 5: Insertar un documento

En el siguiente ejemplo de ejemplo de código, se muestra cómo ejecutar unINSERTstatement. QLDB apoya elPartiQLlenguaje de consulta (compatible con SQL) y elAmazon Ionformato de datos (superconjunto de JSON).

Uso de PartiQL

El código siguiente inserta un documento en elPeopletabla utilizando una sentencia PartiQL literal de cadena.

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

Uso de tipos de datos Ion

Similar a Go's built-inPaquete JSON, puedes ordenar y desorganizar tipos de datos de Go hacia y desde Ion.

  1. Suponga que tiene la siguiente estructura de Go de denominadaPerson.

    type Person struct { FirstName string `ion:"firstName"` LastName string `ion:"lastName"` Age int `ion:"age"` }
  2. Cree una instancia de Person.

    person := Person{"John", "Doe", 54}

    El conductor organiza una representación de texto codificada por iones depersonpara usted.

    importante

    Para que marshal y unmarshal funcionen correctamente, se deben exportar los nombres de campo de la estructura de datos de Go (la primera letra se escribe en mayúscula).

  3. Pasar elpersoninstancia a la transacciónExecuteMétodo de.

    _, err = driver.Execute(context.Background(), func(txn qldbdriver.Transaction) (interface{}, error) { return txn.Execute("INSERT INTO People ?", person) }) if err != nil { panic(err) }

    En el ejemplo de este ejemplo de interrogación (?) como marcador de posición variable para pasar la información del documento a la declaración. Cuando utilice marcadores de posición, debe pasar un valor de texto codificado con iones.

    sugerencia

    Para insertar varios documentos mediante un únicoINSERT, puede pasar un parámetro de tipolistaa la declaración de la siguiente manera.

    // people is a list txn.Execute("INSERT INTO People ?", people)

    No se incluye el marcador de posición de la variable (?) entre corchetes angulares dobles (<<...>>) al pasar una lista. En las instrucciones manuales de PartiQL, los corchetes angulares dobles denotan una colección desordenada conocida comobolsa.

Paso 6: Consultar el documento

En el siguiente ejemplo de ejemplo de código, se muestra cómo ejecutar unSELECTstatement.

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

En este ejemplo, se consulta el documento desde laPeople, asume que el conjunto de resultados no está vacío y devuelve el documento a partir del resultado.

Paso 7: Actualización del documento

En el siguiente ejemplo de ejemplo de código, se muestra cómo ejecutar unUPDATEstatement.

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

Paso 8: Consultar el documento actualizado

En el siguiente ejemplo de ejemplo de código,Peopletable defirstNamey devuelve todos los documentos del conjunto de resultados.

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

Paso 9: Eliminar la tabla

En el siguiente ejemplo de ejemplo de código, se muestra cómo ejecutar unDROP TABLEstatement.

_, err = driver.Execute(context.Background(), func(txn qldbdriver.Transaction) (interface{}, error) { return txn.Execute("DROP TABLE People") }) if err != nil { panic(err) }

Ejecución de la aplicación completa

El siguiente ejemplo de código es la versión completa de la aplicación. En lugar de realizar los pasos anteriores de forma individual, también puede copiar y ejecutar este ejemplo de código de principio a fin. Esta aplicación muestra algunas operaciones CRUD básicas en el libro mayor denominadoquick-start.

nota

Antes de ejecutar este código, asegúrese de que no tiene ya una tabla activa llamadaPeopleen laquick-startlibro mayor.

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