Objetivos
En este tutorial se explican los siguientes pasos para usar el proxy local de Spanner PGAdapter para controladores de PostgreSQL:
- 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.
Preparar el entorno local de PGAdapter
Puedes usar controladores de PostgreSQL junto con PGAdapter para conectarte a Spanner. PGAdapter es un proxy local que traduce el protocolo de red de PostgreSQL al protocolo gRPC de Spanner.
Para ejecutar PGAdapter, se necesita Java o Docker.
Instala uno de los siguientes elementos en tu máquina de desarrollo si aún no lo has hecho:
Clona el repositorio de aplicaciones de muestra en la máquina local:
git clone https://github.com/GoogleCloudPlatform/pgadapter.git
Cambia al directorio que contiene el código de ejemplo de Spanner:
psql
cd pgadapter/samples/snippets/psql-snippets
Java
cd pgadapter/samples/snippets/java-snippets mvn package -DskipTests
Go
cd pgadapter/samples/snippets/golang-snippets
Node.js
cd pgadapter/samples/snippets/nodejs-snippets npm install
Python
cd pgadapter/samples/snippets/python-snippets python -m venv ./venv pip install -r requirements.txt cd samples
C#
cd pgadapter/samples/snippets/dotnet-snippets
PHP
cd pgadapter/samples/snippets/php-snippets composer install cd samples
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 PGAdapter.
Echa un vistazo a la carpetasamples/snippets
, 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.
Iniciar PGAdapter
Inicia PGAdapter en tu máquina de desarrollo local y dirígelo a la instancia que has creado.
En los siguientes comandos se presupone que has ejecutado
gcloud auth application-default login
.
Aplicación Java
wget https://storage.googleapis.com/pgadapter-jar-releases/pgadapter.tar.gz \
&& tar -xzvf pgadapter.tar.gz
java -jar pgadapter.jar -i test-instance
Docker
docker pull gcr.io/cloud-spanner-pg-adapter/pgadapter
docker run \
--name pgadapter \
--rm -d -p 5432:5432 \
-v "$HOME/.config/gcloud":/gcloud:ro \
--env CLOUDSDK_CONFIG=/gcloud \
gcr.io/cloud-spanner-pg-adapter/pgadapter \
-i test-instance -x
Emulador
docker pull gcr.io/cloud-spanner-pg-adapter/pgadapter-emulator
docker run \
--name pgadapter-emulator \
--rm -d \
-p 5432:5432 \
-p 9010:9010 \
-p 9020:9020 \
gcr.io/cloud-spanner-pg-adapter/pgadapter-emulator
De esta forma, se inicia PGAdapter con un emulador de Spanner insertado. Este emulador insertado crea automáticamente cualquier instancia o base de datos de Spanner a la que te conectes sin necesidad de crearlas manualmente antes.
Te recomendamos que ejecutes PGAdapter en producción como un contenedor sidecar o como una dependencia en el proceso. Para obtener más información sobre cómo implementar PGAdapter en producción, consulta Elegir un método para ejecutar PGAdapter.
Crear una base de datos
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.
psql
Java
Go
Node.js
Python
C#
PHP
Ejecuta el ejemplo con el siguiente comando:
psql
PGDATABASE=example-db ./create_tables.sh example-db
Java
java -jar target/pgadapter-snippets/pgadapter-samples.jar createtables example-db
Go
go run sample_runner.go createtables example-db
Node.js
npm start createtables example-db
Python
python create_tables.py example-db
C#
dotnet run createtables example-db
PHP
php create_tables.php example-db
El siguiente paso consiste en escribir datos en la base de datos.
Crear una conexión
Antes de poder leer o escribir, debes crear una conexión con PGAdapter. Todas tus interacciones con Spanner deben realizarse a través de unConnection
. El nombre de la base de datos se especifica en la cadena de conexión.
psql
Java
Go
Node.js
Python
C#
PHP
Ejecuta el ejemplo con el siguiente comando:
psql
PGDATABASE=example-db ./create_connection.sh
Java
java -jar target/pgadapter-snippets/pgadapter-samples.jar createconnection example-db
Go
go run sample_runner.go createconnection example-db
Node.js
npm start createconnection example-db
Python
python create_connection.py example-db
C#
dotnet run createconnection example-db
PHP
php create_connection.php example-db
Escribir datos con DML
Puedes insertar datos mediante el lenguaje de manipulación de datos (DML) en una transacción de lectura y escritura.
En estos ejemplos se muestra cómo ejecutar una instrucción DML en Spanner con un controlador de PostgreSQL.
psql
Java
Go
Node.js
Python
C#
PHP
Ejecuta el ejemplo con el siguiente comando:
psql
PGDATABASE=example-db ./write_data_with_dml.sh
Java
java -jar target/pgadapter-snippets/pgadapter-samples.jar writeusingdml example-db
Go
go run sample_runner.go writeusingdml example-db
Node.js
npm start writeusingdml example-db
Python
python write_data_with_dml.py example-db
C#
dotnet run writeusingdml example-db
PHP
php write_data_with_dml.php example-db
Deberías ver la siguiente respuesta:
4 records inserted.
Escribir datos con un lote de DML
PGAdapter admite la ejecución de lotes de DML. Si envías varias instrucciones DML en un lote, se reduce el número de viajes de ida y vuelta a Spanner y se mejora el rendimiento de tu aplicación.
psql
Java
Go
Node.js
Python
C#
PHP
Ejecuta el ejemplo con el siguiente comando:
psql
PGDATABASE=example-db ./write_data_with_dml_batch.sh
Java
java -jar target/pgadapter-snippets/pgadapter-samples.jar writeusingdmlbatch example-db
Go
go run sample_runner.go writeusingdmlbatch example-db
Node.js
npm start writeusingdmlbatch example-db
Python
python write_data_with_dml_batch.py example-db
C#
dotnet run writeusingdmlbatch example-db
PHP
php write_data_with_dml_batch.php example-db
Deberías ver lo siguiente:
3 records inserted.
Escribir datos con mutaciones
También puedes insertar datos mediante mutaciones.
PGAdapter traduce el comando COPY
de PostgreSQL a mutaciones. Usar COPY
es la forma más eficiente de insertar datos rápidamente en tu base de datos de Spanner.
Las operaciones COPY
son atómicas de forma predeterminada. Las operaciones atómicas en Spanner están sujetas al límite de tamaño de la confirmación.
Consulta más información sobre el límite de CRUD.
En estos ejemplos se muestra cómo ejecutar una operación COPY
no atómica. Esto permite que la operación COPY
supere el límite de tamaño de confirmación.
psql
Java
Go
Node.js
Python
C#
PHP
Ejecuta el ejemplo con el siguiente comando:
psql
PGDATABASE=example-db ./write_data_with_copy.sh
Java
java -jar target/pgadapter-snippets/pgadapter-samples.jar write example-db
Go
go run sample_runner.go write example-db
Node.js
npm start write example-db
Python
python write_data_with_copy.py example-db
C#
dotnet run write example-db
PHP
php write_data_with_copy.php example-db
Deberías ver lo siguiente:
Copied 5 singers
Copied 5 albums
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 un controlador de PostgreSQL.
En la línea de comandos
Ejecuta la siguiente instrucció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 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 un controlador PostgreSQL
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 un controlador de PostgreSQL.
psql
Java
Go
Node.js
Python
C#
PHP
Ejecuta el ejemplo con el siguiente comando:
psql
PGDATABASE=example-db ./query_data.sh
Java
java -jar target/pgadapter-snippets/pgadapter-samples.jar query example-db
Go
go run sample_runner.go query example-db
Node.js
npm start query example-db
Python
python query_data.py example-db
C#
dotnet run query example-db
PHP
php query_data.php example-db
El resultado debe ser el 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
.
psql
Java
Go
Node.js
Python
C#
PHP
Ejecuta el ejemplo con el siguiente comando:
psql
PGDATABASE=example-db ./query_data_with_parameter.sh
Java
java -jar target/pgadapter-snippets/pgadapter-samples.jar querywithparameter example-db
Go
go run sample_runner.go querywithparameter example-db
Node.js
npm start querywithparameter example-db
Python
python query_data_with_parameter.py example-db
C#
dotnet run querywithparameter example-db
PHP
php query_data_with_parameter.php example-db
El resultado debe ser el 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 con un controlador de PostgreSQL.
En la línea de comandos
Usa el siguiente comando ALTER TABLE
para añadir la nueva columna a la tabla:
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 un controlador PostgreSQL
Ejecuta la instrucción DDL con un controlador de PostgreSQL para modificar el esquema:
psql
Java
Go
Node.js
Python
C#
PHP
Ejecuta el ejemplo con el siguiente comando:
psql
PGDATABASE=example-db ./add_column.sh
Java
java -jar target/pgadapter-snippets/pgadapter-samples.jar addmarketingbudget example-db
Go
go run sample_runner.go addmarketingbudget example-db
Node.js
npm start addmarketingbudget example-db
Python
python add_column.py example-db
C#
dotnet run addmarketingbudget example-db
PHP
php add_column.php example-db
Deberías ver lo siguiente:
Added marketing_budget column
Ejecutar un lote de DDL
Se recomienda ejecutar varias modificaciones de esquema en un lote.
Puede ejecutar varias instrucciones DDL en un lote mediante la función de procesamiento por lotes integrada de su controlador PostgreSQL, enviando todas las instrucciones DDL como una cadena de SQL separada por puntos y comas o mediante las instrucciones START BATCH DDL
y RUN BATCH
.
psql
Java
Go
Node.js
Python
C#
PHP
Ejecuta el ejemplo con el siguiente comando:
psql
PGDATABASE=example-db ./ddl_batch.sh
Java
java -jar target/pgadapter-snippets/pgadapter-samples.jar ddlbatch example-db
Go
go run sample_runner.go ddlbatch example-db
Node.js
npm start ddlbatch example-db
Python
python ddl_batch.py example-db
C#
dotnet run ddlbatch example-db
PHP
php ddl_batch.php example-db
Deberías ver 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)
.
COPY
de PostgreSQL a mutaciones. Los comandos COPY
se traducen de forma predeterminada a mutaciones Insert
.
Ejecuta set spanner.copy_upsert=true
para traducir los comandos de COPY
a mutaciones de InsertOrUpdate
. Se puede usar para actualizar los datos de Spanner.
psql
Java
Go
Node.js
Python
C#
PHP
Ejecuta el ejemplo con el siguiente comando:
psql
PGDATABASE=example-db ./update_data_with_copy.sh
Java
java -jar target/pgadapter-snippets/pgadapter-samples.jar update example-db
Go
go run sample_runner.go update example-db
Node.js
npm start update example-db
Python
python update_data_with_copy.py example-db
C#
dotnet run update example-db
PHP
php update_data_with_copy.php example-db
Deberías ver lo siguiente:
Updated 2 albums
También puedes ejecutar una consulta de SQL para obtener los valores que acabas de escribir.
Aquí está el código para ejecutar la consulta:
psql
Java
Go
Node.js
Python
C#
PHP
Ejecuta la consulta con este comando:
psql
PGDATABASE=example-db ./query_data_with_new_column.sh
Java
java -jar target/pgadapter-snippets/pgadapter-samples.jar querymarketingbudget example-db
Go
go run sample_runner.go querymarketingbudget example-db
Node.js
npm start querymarketingbudget example-db
Python
python query_data_with_new_column.py example-db
C#
dotnet run querymarketingbudget example-db
PHP
php query_data_with_new_column.php 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.
psql
Java
Go
Node.js
Python
C#
PHP
Ejecuta el ejemplo con el siguiente comando:
psql
PGDATABASE=example-db ./update_data_with_transaction.sh
Java
java -jar target/pgadapter-snippets/pgadapter-samples.jar writewithtransactionusingdml example-db
Go
go run sample_runner.go writewithtransactionusingdml example-db
Node.js
npm start writewithtransactionusingdml example-db
Python
python update_data_with_transaction.py example-db
C#
dotnet run writewithtransactionusingdml example-db
PHP
php update_data_with_transaction.php example-db
Deberías ver lo siguiente:
Transferred marketing budget from Album 2 to Album 1
Etiquetas de transacción y de solicitud
Usa etiquetas de transacción y de solicitud
para solucionar problemas de transacciones y consultas en Spanner. Puede definir etiquetas de transacción y de solicitud con las variables de sesión SPANNER.TRANSACTION_TAG
y SPANNER.STATEMENT_TAG
.
psql
Java
Go
Node.js
Python
C#
PHP
Ejecuta el ejemplo con el siguiente comando:
psql
PGDATABASE=example-db ./tags.sh
Java
java -jar target/pgadapter-snippets/pgadapter-samples.jar tags example-db
Go
go run sample_runner.go tags example-db
Node.js
npm start tags example-db
Python
python tags.py example-db
C#
dotnet run tags example-db
PHP
php tags.php 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.
Define la conexión como de solo lectura o usa la instrucción SET TRANSACTION READ ONLY
SQL
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:
psql
Java
Go
Node.js
Python
C#
PHP
Ejecuta el ejemplo con el siguiente comando:
psql
PGDATABASE=example-db ./read_only_transaction.sh
Java
java -jar target/pgadapter-snippets/pgadapter-samples.jar readonlytransaction example-db
Go
go run sample_runner.go readonlytransaction example-db
Node.js
npm start readonlytransaction example-db
Python
python read_only_transaction.py example-db
C#
dotnet run readonlytransaction example-db
PHP
php read_only_transaction.php example-db
El resultado que verás debe parecerse al 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 de consulta 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.
psql
Java
Go
Node.js
Python
C#
PHP
Ejecuta el ejemplo con el siguiente comando:
psql
PGDATABASE=example-db ./data_boost.sh
Java
java -jar target/pgadapter-snippets/pgadapter-samples.jar databoost example-db
Go
go run sample_runner.go databoost example-db
Node.js
npm start databoost example-db
Python
python data_boost.py example-db
C#
dotnet run databoost example-db
PHP
php data_boost.php example-db
Para obtener más información sobre cómo ejecutar consultas particionadas y usar Data Boost con PGAdapter, consulta Data Boost y las instrucciones de consultas particionadas.
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.
psql
Java
Go
Node.js
Python
C#
PHP
Ejecuta el ejemplo con el siguiente comando:
psql
PGDATABASE=example-db ./partitioned_dml.sh
Java
java -jar target/pgadapter-snippets/pgadapter-samples.jar partitioneddml example-db
Go
go run sample_runner.go partitioneddml example-db
Node.js
npm start partitioneddml example-db
Python
python partitioned_dml.py example-db
C#
dotnet run datpartitioneddmlboost example-db
PHP
php partitioned_dml.php 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.