Prepare su entorno C++ local Clone el repositorio de aplicaciones de muestra en su máquina local:
git clone https : //github.com/googleapis/google-cloud-cpp $HOME/google-cloud-cpp
Instale Bazel para Linux siguiendo estas instrucciones .
Cambie al directorio que contiene el código de muestra de Spanner:
cd $HOME / google - cloud - cpp
Construya las muestras con este comando:
bazel build //google/cloud/spanner/samples:samples
Configurar la autenticación y la autorización para el proyecto google-cloud-cpp
.
gcloud auth application - default login
Cree una variable de entorno llamada GCLOUD_PROJECT
. Reemplace [MY_PROJECT_ID] con su Google Cloud ID del proyecto. Puede encontrarlo en la página de bienvenida de su proyecto.
export GCLOUD_PROJECT = [ MY_PROJECT_ID ]
Crear una instancia Al usar Spanner por primera vez, debe crear una instancia, que consiste en una asignación de recursos que utilizan las bases de datos de Spanner. Al crear una instancia, se elige una configuración que determina dónde se almacenan los datos y el número de nodos a usar, lo que determina la cantidad de recursos de servicio y almacenamiento en la instancia.
Ejecute el siguiente comando para crear una instancia de Spanner en la región us-central1
con 1 nodo:
gcloud spanner instances create test-instance --config= regional-us-central1 \
--description= "Test Instance" --nodes= 1
Tenga en cuenta que esto crea una instancia con las siguientes características:
ID de instancia test-instance
Nombre para mostrar Test Instance
Configuración de instancia regional-us-central1
(las configuraciones regionales almacenan datos en una región, mientras que las configuraciones multirregionales distribuyen datos entre varias regiones. Para obtener más información, consulte Acerca de las instancias ). Cantidad de nodos de 1 ( node_count
corresponde a la cantidad de recursos de servicio y almacenamiento disponibles para las bases de datos en la instancia. Obtenga más información en Nodos y unidades de procesamiento ). Deberías ver:
Creating instance ... done .
Mirar archivos de muestra El repositorio de muestras contiene un ejemplo que muestra cómo utilizar Spanner con C++.
Consulte el archivo google/cloud/spanner/samples/samples.cc
, que muestra cómo crear una base de datos y modificar su esquema. Los datos utilizan el esquema de ejemplo que se muestra en la página Esquema y modelo de datos .
Crear una base de datos Google SQL
bazel run //google/cloud/spanner/samples:samples -- \
create-database $GCLOUD_PROJECT test-instance example-db
PostgreSQL
bazel run //google/cloud/spanner/samples:postgresql_samples -- \
create-database $GCLOUD_PROJECT test-instance example-db
bazel run //google/cloud/spanner/samples:postgresql_samples -- \
interleaved-table $GCLOUD_PROJECT test-instance example-db
Nota: Algunas sintaxis de Bazel, como --
, parecen similares a la sintaxis de bash, pero no lo son. Para más información, consulte la página Comandos y opciones de Bazel. Deberías ver:
Created database [ projects / $ { GCLOUD_PROJECT } / instances / test - instance / databases / example - db ]
El siguiente código crea una base de datos y dos tablas en la base de datos. Nota: Los ejemplos de código siguientes utilizan estas dos tablas. Si no ejecuta este código, cree las tablas utilizando Google Cloud Consola o la CLI de gcloud. Para más información, consulte el esquema de ejemplo . PostgreSQL En el dialecto PostgreSQL, la base de datos debe crearse antes de enviar una solicitud DDL para crear una tabla.
El siguiente ejemplo crea una base de datos:
El siguiente ejemplo crea las dos tablas en la base de datos:
El siguiente paso es escribir datos en su base de datos.
Crear un cliente de base de datos Antes de poder realizar lecturas o escrituras, debe crear un Client
:
Un Client
permite leer, escribir, consultar y ejecutar transacciones en una base de datos Spanner. Normalmente, se crea un Client
al iniciar la aplicación y luego se reutiliza para leer, escribir y ejecutar Client
. Cada cliente utiliza recursos de Spanner. El destructor de Client
borrará automáticamente los recursos Client
, incluidas las conexiones de red.
Lea más sobre Client
en el Google Cloud Referencia de C++ de Spanner .
Escribir datos con DML Puede insertar datos utilizando el lenguaje de manipulación de datos (DML) en una transacción de lectura y escritura.
Utilice la función Client::ExecuteDml()
para ejecutar una declaración DML.
Ejecute el ejemplo utilizando el argumento getting-started-insert
.
bazel run //google/cloud/spanner/samples:samples -- \
getting-started-insert $GCLOUD_PROJECT test-instance example-db
Deberías ver:
Insert was successful [ spanner_dml_getting_started_insert ]
Nota: Hay límites para el tamaño de las confirmaciones. Consulta el límite de CRUD para más información.
Escribir datos con mutaciones También puedes insertar datos usando mutaciones .
Se escriben datos mediante un objeto Client
. La función Client::Commit()
crea y confirma una transacción para escrituras que se ejecutan de forma automática en un único punto lógico en el tiempo, en columnas, filas y tablas de una base de datos.
Este código muestra cómo escribir los datos usando mutaciones:
Ejecute la muestra utilizando el argumento insert-data
.
bazel run //google/cloud/spanner/samples:samples -- \
insert-data $GCLOUD_PROJECT test-instance example-db
Deberías ver:
Insert was successful [ spanner_insert_data ]
Nota: Hay límites para el tamaño de las confirmaciones. Consulta el límite de CRUD para más información. 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 mediante programación mediante la biblioteca cliente Spanner para C++.
En la línea de comandos Ejecute la siguiente declaración SQL para leer los valores de todas las columnas de la tabla Albums
:
gcloud spanner databases execute - sql example - db -- instance = test - instance \
-- sql = ' SELECT SingerId , AlbumId , AlbumTitle FROM Albums '
El resultado debería ser:
SingerId AlbumId AlbumTitle
1 1 Total Junk
1 2 Go , Go , Go
2 1 Green
2 2 Forever Hold Your Peace
2 3 Terrified
Utilice la biblioteca cliente Spanner para C++ Además de ejecutar una declaración SQL en la línea de comandos, puede emitir la misma declaración SQL mediante programación utilizando la biblioteca cliente Spanner para C++.
Se utiliza la función Client::ExecuteQuery()
para ejecutar la consulta SQL. A continuación, se explica cómo ejecutar la consulta y acceder a los datos:
Ejecute la muestra utilizando el argumento query_data
.
bazel run //google/cloud/spanner/samples:samples -- \
query-data $GCLOUD_PROJECT test-instance example-db
Deberías ver el siguiente resultado:
SingerId : 1 LastName : Richards
SingerId : 2 LastName : Smith
SingerId : 3 LastName : Trentor
SingerId : 4 LastName : Martin
SingerId : 5 LastName : Lomond
SingerId : 12 LastName : Garcia
SingerId : 13 LastName : Morales
SingerId : 14 LastName : Long
SingerId : 15 LastName : Shaw
Consulta utilizando un parámetro SQL Si su aplicación tiene una consulta que se ejecuta con frecuencia, puede mejorar su rendimiento parametrizándola. La consulta paramétrica resultante puede almacenarse en caché y reutilizarse, lo que reduce los costos de compilación. Para obtener más información, consulte Usar parámetros de consulta para acelerar las consultas que se ejecutan con frecuencia .
A continuación se muestra un ejemplo del uso de un parámetro en la cláusula WHERE
para consultar registros que contienen un valor específico para LastName
.
Ejecute la muestra utilizando el comando query-with-parameter.
bazel run //google/cloud/spanner/samples:samples -- \
query-with-parameter $GCLOUD_PROJECT test-instance example-db
Deberías ver el siguiente resultado:
SingerId : 12 FirstName : Melissa LastName : Garcia
Leer datos usando la API de lectura Además de la interfaz SQL de Spanner, Spanner también admite una interfaz de lectura.
Utilice la función Client::Read()
para leer filas de la base de datos. Utilice un objeto KeySet
para definir una colección de claves y rangos de claves para leer.
Aquí se explica cómo leer los datos:
Ejecute la muestra utilizando el argumento read-data
.
bazel run //google/cloud/spanner/samples:samples -- \
read-data $GCLOUD_PROJECT test-instance example-db
Debería ver un resultado similar a este:
SingerId : 1 , AlbumId : 1 , AlbumTitle : Total Junk
SingerId : 1 , AlbumId : 2 , AlbumTitle : Go , Go , Go
SingerId : 2 , AlbumId : 1 , AlbumTitle : Green
SingerId : 2 , AlbumId : 2 , AlbumTitle : Forever Hold Your Peace
SingerId : 2 , AlbumId : 3 , AlbumTitle : Terrified
Actualizar el esquema de la base de datos Supongamos que necesita agregar una nueva columna llamada MarketingBudget
a la tabla Albums
. Agregar una nueva columna a una tabla existente requiere actualizar el esquema de su base de datos. Spanner admite actualizaciones de esquema en una base de datos mientras esta continúa gestionando el tráfico. Las actualizaciones de esquema no requieren desconectar la base de datos ni bloquean tablas o columnas completas; puede seguir escribiendo datos en la base de datos durante la actualización del esquema. Obtenga más información sobre las actualizaciones de esquema admitidas y el rendimiento de los cambios de esquema en Realizar actualizaciones de esquema .
Agregar una columna Puede agregar una columna en la línea de comando mediante la CLI de Google Cloud o mediante programación utilizando la biblioteca cliente Spanner para C++.
En la línea de comandos Utilice el siguiente comando ALTER TABLE
para agregar la nueva columna a la tabla:
Google SQL
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 MarketingBudget BIGINT '
Deberías ver:
Schema updating ... done .
Utilice la biblioteca cliente Spanner para C++ Utilice la función DatabaseAdminClient::UpdateDatabase()
para modificar el esquema.
Ejecute la muestra utilizando el comando add-column
.
bazel run //google/cloud/spanner/samples:samples -- \
add-column $GCLOUD_PROJECT test-instance example-db
Deberías ver:
Added MarketingBudget column
Escribir datos en la nueva columna El siguiente código escribe datos en la nueva columna. Establece MarketingBudget
en 100000
para la fila especificada por Albums(1, 1)
y en 500000
para la fila especificada por Albums(2, 2)
.
Ejecute la muestra utilizando el argumento update-data
.
bazel run //google/cloud/spanner/samples:samples -- \
update-data $GCLOUD_PROJECT test-instance example-db
También puede ejecutar una consulta SQL o una llamada de lectura para obtener los valores que acaba de escribir.
Aquí está el código para ejecutar la consulta:
Para ejecutar esta consulta, ejecute el ejemplo utilizando el argumento query-new-column
.
bazel run //google/cloud/spanner/samples:samples -- \
query-new-column $GCLOUD_PROJECT test-instance example-db
Deberías ver:
SingerId : 1 AlbumId : 1 MarketingBudget : 100000
SingerId : 1 AlbumId : 2 MarketingBudget : NULL
SingerId : 2 AlbumId : 1 MarketingBudget : NULL
SingerId : 2 AlbumId : 2 MarketingBudget : 500000
SingerId : 2 AlbumId : 3 MarketingBudget : NULL
Actualizar datos Puede actualizar datos utilizando DML en una transacción de lectura y escritura.
Utilice la función Client::ExecuteDml()
para ejecutar una declaración DML.
Ejecute el ejemplo utilizando el argumento getting-started-update
.
bazel run //google/cloud/spanner/samples:samples -- \
getting-started-update $GCLOUD_PROJECT test-instance example-db
Deberías ver:
Update was successful [ spanner_dml_getting_started_update ]
Utilice un índice secundario Supongamos que desea obtener todas las filas de Albums
con valores AlbumTitle
dentro de un rango determinado. Podría leer todos los valores de la columna AlbumTitle
mediante una sentencia SQL o una llamada de lectura y luego descartar las filas que no cumplan los criterios. Sin embargo, realizar este análisis completo de la tabla es costoso, especialmente en tablas con muchas filas. En su lugar, puede acelerar la recuperación de filas al buscar por columnas que no sean de clave principal creando un índice secundario en la tabla.
Añadir un índice secundario a una tabla existente requiere una actualización del esquema. Al igual que otras actualizaciones de esquema, Spanner permite añadir un índice mientras la base de datos sigue gestionando el tráfico. Spanner rellena automáticamente el índice con los datos existentes. El proceso de rellenado puede tardar unos minutos, pero no es necesario desconectar la base de datos ni evitar escribir en la tabla indexada durante el proceso. Para más información, consulte "Añadir un índice secundario" .
Tras agregar un índice secundario, Spanner lo usa automáticamente para las consultas SQL que probablemente se ejecuten más rápido con él. Si usa la interfaz de lectura, debe especificar el índice que desea usar.
Agregar un índice secundario Puede agregar un índice en la línea de comando usando la CLI de gcloud o programáticamente usando la biblioteca cliente Spanner para C++.
En la línea de comandos Utilice el siguiente comando CREATE INDEX
para agregar un índice a la base de datos:
gcloud spanner databases ddl update example-db --instance= test-instance \
--ddl= 'CREATE INDEX AlbumsByAlbumTitle ON Albums(AlbumTitle)'
Deberías ver:
Schema updating ... done .
Uso de la biblioteca cliente Spanner para C++ Utilice la función DatabaseAdminClient::UpdateDatabase()
para agregar un índice:
Ejecute la muestra utilizando el argumento add-index
.
bazel run //google/cloud/spanner/samples:samples -- \
add-index $GCLOUD_PROJECT test-instance example-db
Añadir un índice puede tardar unos minutos. Una vez añadido, debería ver un resultado similar a este:
` AlbumsByAlbumTitle ` Index successfully added , new DDL :
database : "projects/$GCLOUD_PROJECT/instances/test-instance/databases/example-db"
statements : "CREATE INDEX AlbumsByAlbumTitle ON Albums(AlbumTitle)"
commit_timestamps {
seconds : 1581011550
nanos : 531102000
}
Leer utilizando el índice Para las consultas SQL, Spanner utiliza automáticamente un índice apropiado. En la interfaz de lectura, debe especificar el índice en su solicitud.
Para utilizar el índice en la interfaz de lectura, utilice la función Client::Read()
, que lee cero o más filas de una base de datos utilizando un índice.
El siguiente código obtiene todas las columnas AlbumId
y AlbumTitle
del índice AlbumsByAlbumTitle
.
Ejecute la muestra utilizando el argumento read-data-with-index
.
bazel run //google/cloud/spanner/samples:samples -- \
read-data-with-index $GCLOUD_PROJECT test-instance example-db
Deberías ver:
AlbumId : 2 AlbumTitle : Forever Hold Your Peace
AlbumId : 2 AlbumTitle : Go , Go , Go
AlbumId : 1 AlbumTitle : Green
AlbumId : 3 AlbumTitle : Terrified
AlbumId : 1 AlbumTitle : Total Junk
Agregar un índice para lecturas de solo índice Quizás haya notado que el ejemplo de lectura anterior no incluye la lectura de la columna MarketingBudget
. Esto se debe a que la interfaz de lectura de Spanner no permite unir un índice con una tabla de datos para buscar valores que no están almacenados en el índice.
Cree una definición alternativa de AlbumsByAlbumTitle
que almacene una copia de MarketingBudget
en el índice.
En la línea de comandos Google SQL
gcloud spanner databases ddl update example - db -- instance = test - instance \
-- ddl = ' CREATE INDEX AlbumsByAlbumTitle2 ON Albums ( AlbumTitle ) STORING ( MarketingBudget )
PostgreSQL
gcloud spanner databases ddl update example - db -- instance = test - instance \
-- ddl = ' CREATE INDEX AlbumsByAlbumTitle2 ON Albums ( AlbumTitle ) INCLUDE ( MarketingBudget )
Añadir un índice puede tardar unos minutos. Una vez añadido, debería ver lo siguiente:
Schema updating ... done .
Uso de la biblioteca cliente Spanner para C++ Utilice la función DatabaseAdminClient::UpdateDatabase()
para agregar un índice con una cláusula STORING
para:
Ejecute la muestra utilizando el argumento add-storing-index
.
bazel run //google/cloud/spanner/samples:samples -- \
add-storing-index $GCLOUD_PROJECT test-instance example-db
Debería ver un resultado similar a este:
` AlbumsByAlbumTitle2 ` Index successfully added , new DDL :
database : "projects/$GCLOUD_PROJECT/instances/test-instance/databases/example-db"
statements : "CREATE INDEX AlbumsByAlbumTitle2 ON Albums(AlbumTitle) STORING (MarketingBudget)"
commit_timestamps {
seconds : 1581012328
nanos : 416682000
}
Ahora puede ejecutar una lectura que obtenga todas las columnas AlbumId
, AlbumTitle
y MarketingBudget
del índice AlbumsByAlbumTitle2
:
Lea los datos utilizando el índice de almacenamiento que creó ejecutando una consulta que especifique explícitamente el índice:
Ejecute la muestra utilizando el argumento read-data-with-storing-index
.
bazel run //google/cloud/spanner/samples:samples -- \
read-data-with-storing-index $GCLOUD_PROJECT test-instance example-db
Debería ver un resultado similar a este:
AlbumId : 2 AlbumTitle : Forever Hold Your Peace MarketingBudget : 520000
AlbumId : 2 AlbumTitle : Go , Go , Go MarketingBudget : NULL
AlbumId : 1 AlbumTitle : Green MarketingBudget : NULL
AlbumId : 3 AlbumTitle : Terrified MarketingBudget : NULL
AlbumId : 1 AlbumTitle : Total Junk MarketingBudget : 80000
Recuperar datos mediante transacciones de solo lectura Supongamos que desea ejecutar más de una lectura en la misma marca de tiempo. Las transacciones de solo lectura siguen un prefijo consistente del historial de confirmación de transacciones, por lo que su aplicación siempre obtiene datos consistentes. El tipo Transaction
se utiliza para representar todo tipo de transacciones. Utilice la función de fábrica MakeReadOnlyTransaction()
para crear una transacción de solo lectura.