Objetivos
En este tutorial se explican los siguientes pasos para usar el controlador database/sql de Spanner:
- Crea una instancia y una base de datos de Spanner.
- Escribir, leer y ejecutar consultas SQL sobre datos en la base de datos.
- Actualizar el esquema de la base de datos.
- Actualizar datos mediante una transacción de lectura y escritura.
- Agregar un índice secundario a la base de datos.
- Usar el índice para leer los datos y ejecutar consultas SQL sobre ellos.
- Recuperar datos mediante una transacción de solo lectura.
Costes
En este tutorial se usa Spanner, que es un componente facturable deGoogle Cloud. Para obtener información sobre el coste de usar Spanner, consulta la página Precios.
Antes de empezar
Sigue los pasos que se describen en la sección Configuración, donde se explica cómo crear y definir un proyecto predeterminado Google Cloud , habilitar la facturación y la API Cloud Spanner, y configurar OAuth 2.0 para obtener las credenciales de autenticación que se usarán con la API Cloud Spanner.
En concreto, asegúrate de ejecutar gcloud auth
application-default login
para configurar tu entorno de desarrollo local con credenciales de autenticación.
Prepara tu base de datos local o entorno SQL
Descarga e instala Go en tu máquina de desarrollo si aún no lo has hecho.
Clona el repositorio de ejemplo en tu máquina local:
git clone https://github.com/googleapis/go-sql-spanner.git
Cambia al directorio que contiene el código de ejemplo de Spanner:
cd go-sql-spanner/snippets
Crear una instancia
La primera vez que uses Spanner, debes crear una instancia, que es una asignación de recursos que utilizan las bases de datos de Spanner. Cuando creas una instancia, tienes que elegir una configuración de instancia, que determina dónde se almacenan tus datos y la cantidad de nodos que se van a usar, lo que permite conocer la cantidad de recursos de almacenamiento y publicación de la instancia.
Consulta Crear una instancia para saber cómo crear una instancia de Spanner con cualquiera de los siguientes métodos. Puedes llamar a tu instancia test-instance
para usarla con otros temas de este documento que hagan referencia a una instancia llamada test-instance
.
- Google Cloud CLI
- La Google Cloud consola
- Una biblioteca de cliente (C++, C#, Go, Java, Node.js, PHP, Python o Ruby)
Consultar los archivos de muestra
El repositorio de ejemplos contiene un ejemplo que muestra cómo usar Spanner con database/sql.
Consulta el archivogetting_started_guide.go
, que muestra cómo usar Spanner. El código muestra cómo crear y usar una nueva base de datos. Los datos
usan el esquema de ejemplo que se muestra en la página Esquema y modelo de datos.
Crear una base de datos
GoogleSQL
gcloud spanner databases create example-db --instance=test-instance
PostgreSQL
gcloud spanner databases create example-db --instance=test-instance \
--database-dialect=POSTGRESQL
Deberías ver lo siguiente:
Creating database...done.
Creación de tablas
El siguiente código crea dos tablas en la base de datos.
GoogleSQL
PostgreSQL
Ejecuta el ejemplo con el siguiente comando:
GoogleSQL
go run getting_started_guide.go createtables projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go createtablespg projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
El siguiente paso consiste en escribir datos en la base de datos.
Crear una conexión
Para poder leer o escribir datos, debes crear unsql.DB
. sql.DB
contiene un grupo de conexiones que se puede usar para interactuar con Spanner. El nombre de la base de datos y otras propiedades de conexión se especifican en el nombre de la fuente de datos de la base de datos o SQL.
GoogleSQL
PostgreSQL
Escribir datos con DML
Puedes insertar datos mediante el lenguaje de manipulación de datos (DML) en una transacción de lectura y escritura.
Usa la función ExecContext
para ejecutar una instrucción DML.
GoogleSQL
PostgreSQL
Ejecuta el ejemplo con el siguiente comando:
GoogleSQL
go run getting_started_guide.go dmlwrite projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go dmlwritepg projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
El resultado muestra lo siguiente:
4 records inserted.
Escribir datos con mutaciones
También puedes insertar datos mediante mutaciones.
Un Mutation
es un contenedor de operaciones de mutación. Una Mutation
representa una secuencia de inserciones, actualizaciones y eliminaciones que Spanner aplica de forma atómica a diferentes filas y tablas de una base de datos de Spanner.
Usa Mutation.InsertOrUpdate()
para crear una mutación INSERT_OR_UPDATE
, que añade una fila o actualiza los valores de las columnas si la fila ya existe. También puedes usar el método
Mutation.Insert()
para crear una mutación INSERT
, que añade una fila.
conn.Raw
para obtener una referencia a la conexión de Spanner subyacente. La función SpannerConn.Apply
aplica mutaciones de forma atómica a la base de datos.
El siguiente código muestra cómo escribir los datos mediante mutaciones:
GoogleSQL
PostgreSQL
Ejecuta el siguiente ejemplo con el argumento write
:
GoogleSQL
go run getting_started_guide.go write projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go writepg projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
Consultar datos mediante SQL
Spanner admite una interfaz SQL para leer datos, a la que puedes acceder en la línea de comandos mediante la CLI de Google Cloud o de forma programática mediante el controlador de base de datos/SQL de Spanner.
En la línea de comandos
Ejecuta la siguiente instrucción SQL para leer los valores de todas las columnas de la tabla Albums
:
GoogleSQL
gcloud spanner databases execute-sql example-db --instance=test-instance \
--sql='SELECT SingerId, AlbumId, AlbumTitle FROM Albums'
PostgreSQL
gcloud spanner databases execute-sql example-db --instance=test-instance \
--sql='SELECT singer_id, album_id, album_title FROM albums'
El resultado muestra lo siguiente:
SingerId AlbumId AlbumTitle
1 1 Total Junk
1 2 Go, Go, Go
2 1 Green
2 2 Forever Hold Your Peace
2 3 Terrified
Usar el controlador de base de datos o SQL de Spanner
Además de ejecutar una instrucción SQL en la línea de comandos, puedes emitir la misma instrucción SQL de forma programática mediante el controlador database/sql de Spanner.
Las siguientes funciones y structs se usan para ejecutar una consulta de SQL:- La función
QueryContext
de la estructuraDB
: úsala para ejecutar una instrucción SQL que devuelva filas, como una consulta o una instrucción DML con una cláusulaTHEN RETURN
. - La struct
Rows
: úsala para acceder a los datos devueltos por una instrucción SQL.
En el siguiente ejemplo se usa la función QueryContext
:
GoogleSQL
PostgreSQL
Ejecuta el ejemplo con el siguiente comando:
GoogleSQL
go run getting_started_guide.go query projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go querypg projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
El resultado muestra lo siguiente:
1 1 Total Junk
1 2 Go, Go, Go
2 1 Green
2 2 Forever Hold Your Peace
2 3 Terrified
Consultar usando un parámetro de SQL
Si tu aplicación tiene una consulta que se ejecuta con frecuencia, puedes mejorar su rendimiento parametrizándola. La consulta paramétrica resultante se puede almacenar en caché y reutilizar, lo que reduce los costes de compilación. Para obtener más información, consulta Usar parámetros de consulta para acelerar las consultas que se ejecutan con frecuencia.
Aquí tienes un ejemplo de cómo usar un parámetro en la cláusula WHERE
para consultar registros que contengan un valor específico de LastName
.
El controlador database/sql de Spanner admite parámetros de consulta posicionales y con nombre. Un ?
en una instrucción SQL indica un parámetro de consulta posicional. Pasa los valores de los parámetros de consulta como argumentos adicionales a la función QueryContext
. Por ejemplo:
GoogleSQL
PostgreSQL
Ejecuta el ejemplo con el siguiente comando:
GoogleSQL
go run getting_started_guide.go querywithparameter projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go querywithparameterpg projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
El resultado muestra lo siguiente:
12 Melissa Garcia
Actualizar el esquema de la base de datos
Supongamos que quiere añadir una nueva columna llamada MarketingBudget
a la tabla Albums
. Para agregar una nueva columna a una tabla existente, es preciso actualizar el esquema de base de datos. Spanner admite actualizaciones de esquemas en una base de datos mientras esta sigue atendiendo tráfico. Para actualizar el esquema, no es necesario desconectar la base de datos y no se bloquean tablas ni columnas completas. Puedes seguir escribiendo datos en la base de datos durante la actualización del esquema. Consulta más información sobre las actualizaciones de esquemas y el rendimiento de los cambios de esquemas admitidos en el artículo Hacer actualizaciones de esquemas.
Añadir una columna
Puedes añadir una columna en la línea de comandos mediante la CLI de Google Cloud o de forma programática mediante el controlador de base de datos/SQL de Spanner.
En la línea de comandos
Usa el siguiente comando ALTER TABLE
para añadir la nueva columna a la tabla:
GoogleSQL
gcloud spanner databases ddl update example-db --instance=test-instance \
--ddl='ALTER TABLE Albums ADD COLUMN MarketingBudget INT64'
PostgreSQL
gcloud spanner databases ddl update example-db --instance=test-instance \
--ddl='alter table albums add column marketing_budget bigint'
Deberías ver lo siguiente:
Schema updating...done.
Usar el controlador de base de datos o SQL de Spanner
Usa la funciónExecContext
para modificar el esquema:
GoogleSQL
PostgreSQL
Ejecuta el ejemplo con el siguiente comando:
GoogleSQL
go run getting_started_guide.go addcolumn projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go addcolumnpg projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
El resultado muestra lo siguiente:
Added MarketingBudget column.
Ejecutar un lote de DDL
Te recomendamos que ejecutes varias modificaciones de esquema en un solo lote. Usa los comandos START BATCH DDL
y RUN BATCH
para ejecutar un lote de DDL. En el siguiente ejemplo se crean dos tablas en un lote:
GoogleSQL
PostgreSQL
Ejecuta el ejemplo con el siguiente comando:
GoogleSQL
go run getting_started_guide.go ddlbatch projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go ddlbatchpg projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
El resultado muestra lo siguiente:
Added Venues and Concerts tables.
Escribir datos en la nueva columna
El siguiente código sirve para escribir datos en la nueva columna. Define MarketingBudget
como 100000
en la fila con la clave Albums(1, 1)
y como 500000
en la fila con la clave Albums(2, 2)
.
GoogleSQL
PostgreSQL
Ejecuta el ejemplo con el siguiente comando:
GoogleSQL
go run getting_started_guide.go update projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go updatepg projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
El resultado muestra lo siguiente:
Updated 2 albums
También puedes ejecutar una consulta de SQL para obtener los valores que acabas de escribir.
En el siguiente ejemplo se usa la función QueryContext
para ejecutar una consulta:
GoogleSQL
PostgreSQL
Para ejecutar esta consulta, ejecuta el siguiente comando:
GoogleSQL
go run getting_started_guide.go querymarketingbudget projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go querymarketingbudgetpg projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
Deberías ver lo siguiente:
1 1 100000
1 2 null
2 1 null
2 2 500000
2 3 null
Actualizar datos
Puedes actualizar datos mediante DML en una transacción de lectura y escritura.
Llama a DB.BeginTx
para ejecutar transacciones de lectura y escritura en database/sql.
GoogleSQL
PostgreSQL
Ejecuta el ejemplo con el siguiente comando:
GoogleSQL
go run getting_started_guide.go writewithtransactionusingdml projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go writewithtransactionusingdmlpg projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
Etiquetas de transacción y de solicitud
Usa etiquetas de transacción y de solicitud
para solucionar problemas de transacciones y consultas en Spanner. Puedes transferir opciones de transacción adicionales a la función spannerdriver.BeginReadWriteTransaction
.
Usa spannerdriver.ExecOptions
para transferir opciones de consulta adicionales a una instrucción SQL. Por ejemplo:
GoogleSQL
PostgreSQL
Ejecuta el ejemplo con el siguiente comando:
GoogleSQL
go run getting_started_guide.go tags projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go tagspg projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
Recuperar datos mediante transacciones de solo lectura
Supongamos que deseas ejecutar más de una lectura en la misma marca de tiempo. En las transacciones de solo lectura se observa un prefijo uniforme del historial de confirmación de transacción, por lo que la aplicación siempre obtiene datos uniformes.
Asigna el valor true
al campo TxOptions.ReadOnly
para ejecutar una transacción de solo lectura.
A continuación, se muestra cómo ejecutar una consulta y realizar una lectura en la misma transacción de solo lectura:
GoogleSQL
PostgreSQL
Ejecuta el ejemplo con el siguiente comando:
GoogleSQL
go run getting_started_guide.go readonlytransaction projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go readonlytransactionpg projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
El resultado muestra lo siguiente:
1 1 Total Junk
1 2 Go, Go, Go
2 1 Green
2 2 Forever Hold Your Peace
2 3 Terrified
2 2 Forever Hold Your Peace
1 2 Go, Go, Go
2 1 Green
2 3 Terrified
1 1 Total Junk
Consultas con particiones y Acelerador de datos
La API partitionQuery
divide una consulta en partes más pequeñas, o particiones, y usa varias
máquinas para obtener las particiones en paralelo. Cada partición se identifica mediante un token de partición. La API partitionQuery tiene una latencia mayor que la API query estándar, ya que solo está diseñada para operaciones en bloque, como exportar o analizar toda la base de datos.
Data Boost te permite ejecutar consultas analíticas y exportaciones de datos con un impacto casi nulo en las cargas de trabajo de la instancia de Spanner aprovisionada. Data Boost solo admite consultas particionadas.
En el siguiente ejemplo se muestra cómo ejecutar una consulta con particiones con Data Boost con el controlador database/sql:
GoogleSQL
PostgreSQL
Ejecuta el ejemplo con el siguiente comando:
GoogleSQL
go run getting_started_guide.go databoost projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go databoostpg projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
DML particionado
El lenguaje de manipulación de datos (DML) particionado se ha diseñado para los siguientes tipos de actualizaciones y eliminaciones en bloque:
- Limpieza periódica y recolección de elementos no utilizados.
- Rellenar las nuevas columnas con valores predeterminados.
GoogleSQL
PostgreSQL
Ejecuta el ejemplo con el siguiente comando:
GoogleSQL
go run getting_started_guide.go pdml projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go pdmlpg projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db
Limpieza
Para evitar que se apliquen cargos adicionales en tu cuenta de Facturación de Cloud por los recursos utilizados en este tutorial, elimina la base de datos y la instancia que has creado.
Eliminar la base de datos
Al eliminar una instancia, se eliminan automáticamente todas sus bases de datos. En este paso se muestra cómo eliminar una base de datos sin eliminar una instancia (se seguirían generando costes por la instancia).
En la línea de comandos
gcloud spanner databases delete example-db --instance=test-instance
Usar la Google Cloud consola
Ve a la página Instancias de Spanner de la Google Cloud consola.
Haz clic en la instancia.
Haz clic en la base de datos que quieras eliminar.
En la página sobre detalles de la base de datos, haz clic en Eliminar.
Confirma que deseas eliminar la base de datos y haz clic en Eliminar.
Eliminar la instancia
Al eliminar una instancia, se borran todas las bases de datos creadas en dicha instancia.
En la línea de comandos
gcloud spanner instances delete test-instance
Usar la Google Cloud consola
Ve a la página Instancias de Spanner de la Google Cloud consola.
Haz clic en tu instancia.
Haz clic en Eliminar.
Confirma que deseas eliminar la instancia y haz clic en Eliminar.
Siguientes pasos
Consulta cómo acceder a Spanner con una instancia de máquina virtual.
Consulta información sobre las credenciales de autorización y autenticación en el artículo Autenticarse en servicios de Cloud mediante bibliotecas de cliente.
Consulta más información sobre las prácticas recomendadas para el diseño de esquemas de Spanner.