Objetivos
En este instructivo, se explican los siguientes pasos para usar Spanner Proxy local de PGAdapter para controladores de PostgreSQL:
- Crea una base de datos y una instancia de Spanner.
- Escribe, lee y ejecuta consultas de SQL sobre datos en la base de datos.
- Actualiza el esquema de la base de datos.
- Actualiza los datos mediante una transacción de lectura y escritura.
- Agrega un índice secundario a la base de datos.
- Usa el índice para leer y ejecutar consultas de SQL sobre datos.
- Recupera datos con una transacción de solo lectura.
Costos
En este instructivo, se usa Spanner, que es un componente facturable del en Google Cloud. Para obtener información sobre el costo de usar Spanner, consulta Precios.
Antes de comenzar
Completa los pasos descritos en Configuración, que abarcan la creación y configuración de un proyecto de Google Cloud predeterminado, la facturación, la habilitación de la API de Cloud Spanner y la configuración de OAuth 2.0 para obtener credenciales de autenticación para usar la API de Cloud Spanner.
En especial, asegúrate de ejecutar gcloud auth
application-default login
para configurar tu entorno de desarrollo local con credenciales de autenticación.
Prepara tu entorno local de PGAdapter
Puedes usar controladores de PostgreSQL junto con PGAdapter para conectarse a Spanner. PGAdapter es un proxy local que traduce el protocolo de red de PostgreSQL al Protocolo gRPC de Spanner.
PGAdapter requiere Java o Docker para ejecutarse.
Instala una de las siguientes opciones en tu máquina de desarrollo si aún no tienes ninguna de ellas:
Clona el repositorio de la app de muestra en tu máquina local:
git clone https://github.com/GoogleCloudPlatform/pgadapter.git
Ve al directorio que contiene el código de muestra 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
Crea una instancia
Cuando usas Spanner por primera vez, debes crear una instancia, que es una asignación de recursos que usan las bases de datos de Spanner. Cuando creas una instancia, debes elegir una configuración de instancia, que determina dónde se almacenan tus datos y también la cantidad de nodos que se usarán, lo que, a su vez, determina la cantidad de recursos de entrega y almacenamiento de tu instancia.
Ejecuta 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
Ten en cuenta que esto crea una instancia con las siguientes características:
- ID de instancia:
test-instance
- Nombre visible:
Test Instance
- Configuración de la instancia:
regional-us-central1
(la configuración regional almacena datos en una región, mientras que la multirregional distribuye datos en varias regiones; Para obtener más información, consulta Acerca de las instancias. - Recuento de nodos: 1 (
node_count
corresponde a la cantidad de recursos de procesamiento y almacenamiento disponibles para las bases de datos de la instancia; Obtén más información en Nodos y unidades de procesamiento de datos).
Deberías ver lo siguiente:
Creating instance...done.
Examina archivos de muestra
El repositorio de muestras contiene una muestra que indica cómo usar Spanner con PGAdapter.
Echa un vistazo a la carpetasamples/snippets
, que muestra cómo usar
Spanner El código es un instructivo sobre cómo crear y usar una base de datos nueva. Los datos utilizan el esquema de ejemplo de la página Esquema y modelo de datos.
Inicia PGAdapter
Inicia PGAdapter en tu máquina de desarrollo local y diríjalo a la instancia que creaste.
En los siguientes comandos, se da por sentado que ejecutaste 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
Emulator
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
Esto inicia PGAdapter con un Spanner incorporado. emulador. Este emulador incorporado crea automáticamente cualquier instancia o base de datos de Spanner a la que te conectes sin necesidad de crearlas manualmente con anterioridad.
Te recomendamos que ejecutes PGAdapter en producción como un contenedor de sidecar o como una dependencia en proceso. Para obtener más información sobre la implementación PGAdapter en producción, consulta Elige un método para ejecutar PGAdapter.
Crea una base de datos
Para crear una base de datos llamada example-db
en la instancia test-instance
, ejecuta lo siguiente en la línea de comandos:
gcloud spanner databases create example-db --instance=test-instance \
--database-dialect=POSTGRESQL
Deberías ver lo siguiente:
Creating database...done.
Crear tablas
El siguiente código crea dos tablas en la base de datos.
psql
Java
Go
Node.js
Python
C#
Ejecuta la muestra 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
El siguiente paso consiste en escribir datos en tu base de datos.
Crear una conexión
Para poder realizar operaciones de lectura o escritura, debes crear una conexión a PGAdapter. Todas tus interacciones con Spanner deben pasar por unConnection
. El nombre de la base de datos se especifica en la cadena de conexión.
psql
Java
Go
Node.js
Python
C#
Ejecuta la muestra 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
Escribe datos con DML
Puedes insertar datos mediante el lenguaje de manipulación de datos (DML) en una transacción de lectura y escritura.
En estas muestras, se indica cómo ejecutar una declaración DML en Spanner con un controlador de PostgreSQL.
psql
Java
Go
Node.js
Python
C#
Ejecuta la muestra 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
Deberías ver la siguiente respuesta:
4 records inserted.
Escribe datos con un lote de DML
PGAdapter admite la ejecución de lotes de DML. Enviar varias instrucciones DML en un lote reduce la cantidad de viajes de ida y vuelta a Spanner y mejora el rendimiento de tu aplicación.
psql
Java
Go
Node.js
Python
C#
Ejecuta la muestra 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
Deberías ver lo siguiente:
3 records inserted.
Escribe datos con mutaciones
También puedes insertar datos mediante mutaciones.
PGAdapter traduce el comando COPY
de PostgreSQL a
mutaciones de los datos. Usar COPY
es la forma más eficiente de insertar datos rápidamente en
tu base de datos de Spanner.
Las operaciones de COPY
son atómicas de forma predeterminada. Las operaciones atómicas en Spanner están limitadas por el límite de tamaño de confirmación.
Consulta el límite de CRUD para obtener más información.
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#
Ejecuta la muestra 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
Deberías ver lo siguiente:
Copied 5 singers
Copied 5 albums
Consulta datos mediante SQL
Spanner admite una interfaz de SQL para leer datos, a la que puedes acceder desde la línea de comandos con Google Cloud CLI o de manera programática con un controlador de PostgreSQL.
En la línea de comandos
Ejecuta la siguiente instrucción de 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 debería ser este:
SingerId AlbumId AlbumTitle
1 1 Total Junk
1 2 Go, Go, Go
2 1 Green
2 2 Forever Hold Your Peace
2 3 Terrified
Usa un controlador de PostgreSQL
Además de ejecutar una instrucción de SQL en la línea de comandos, puedes emitir la misma instrucción de SQL de manera programática con un controlador de PostgreSQL.
psql
Java
Go
Node.js
Python
C#
Ejecuta la muestra 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
Deberías ver el siguiente resultado:
1 1 Total Junk
1 2 Go, Go, Go
2 1 Green
2 2 Forever Hold Your Peace
2 3 Terrified
Consulta mediante un parámetro de SQL
Si tu aplicación tiene una consulta ejecutada con frecuencia, puedes mejorar su rendimiento. al parametrizarlo. La consulta paramétrica resultante puede almacenarse en caché y volverse a usar, lo que reduce los costos de compilación. Para obtener más información, consulta Usa parámetros de consulta para acelerar las consultas que se ejecutan con frecuencia.
Este es un ejemplo del uso de un parámetro en la cláusula WHERE
para
Consultar registros que contengan un valor específico para LastName
.
psql
Java
Go
Node.js
Python
C#
Ejecuta la muestra 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
Deberías ver el siguiente resultado:
12 Melissa Garcia
Actualiza el esquema de la base de datos
Supongamos que necesitas agregar una columna nueva llamada MarketingBudget
a la tabla Albums
. Para agregar una columna nueva a una tabla existente, es necesario actualizar el esquema de la base de datos. Spanner admite actualizaciones de esquema en una base de datos, mientras que
base de datos siga entregando tráfico. Las actualizaciones de esquema no requieren que la base de datos esté sin conexión y no bloquean tablas ni columnas completas. Puedes continuar escribiendo datos en la base de datos durante la actualización del esquema. Obtén más información sobre las actualizaciones admitidas del esquema y el rendimiento de los cambios de esquema en Cómo realizar actualizaciones de esquema.
Agrega una columna
Puedes agregar una columna en la línea de comandos con la CLI de Google Cloud o de manera programática con un controlador de PostgreSQL.
En la línea de comandos
Usa el siguiente comando ALTER TABLE
para agregar la columna nueva 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.
Usa un controlador de PostgreSQL
Ejecuta la instrucción de DDL con un controlador de PostgreSQL para modificar el esquema:
psql
Java
Go
Node.js
Python
C#
Ejecuta la muestra 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
Deberías ver lo siguiente:
Added marketing_budget column
Ejecuta un lote de DDL
Se recomienda ejecutar varias modificaciones de esquemas en un solo lote.
Puedes ejecutar varias instrucciones DDL en un lote con la función de procesamiento por lotes integrada de tu controlador de PostgreSQL, enviando todas las instrucciones DDL como una cadena SQL separada por punto y coma, o con las instrucciones START BATCH DDL
y RUN BATCH
.
psql
Java
Go
Node.js
Python
C#
Ejecuta la muestra 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
Deberías ver lo siguiente:
Added venues and concerts tables
Escribe datos en la columna nueva
Con el siguiente código, se escriben datos en la columna nueva. Establece MarketingBudget
en 100000
para la fila marcada por Albums(1, 1)
y en 500000
para la fila marcada por Albums(2, 2)
.
COPY
de PostgreSQL a mutaciones. De forma predeterminada, los comandos COPY
se traducen a mutaciones Insert
.
Ejecuta set spanner.copy_upsert=true
para traducir los comandos de COPY
al
InsertOrUpdate
. Esto se puede usar para actualizar los datos existentes en
Spanner
psql
Java
Go
Node.js
Python
C#
Ejecuta la muestra 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
Deberías ver lo siguiente:
Updated 2 albums
También puedes ejecutar una consulta de SQL para obtener los valores que acabas de escribir.
Este es el código para ejecutar la consulta:
psql
Java
Go
Node.js
Python
C#
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
Deberías ver lo siguiente:
1 1 100000
1 2 null
2 1 null
2 2 500000
2 3 null
Actualiza datos
Puedes actualizar los datos mediante DML en una transacción de lectura y escritura.
psql
Java
Go
Node.js
Python
C#
Ejecuta la muestra 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
Deberías ver lo siguiente:
Transferred marketing budget from Album 2 to Album 1
Etiquetas de transacción y de solicitud
Utiliza etiquetas de transacción y etiquetas de solicitud.
para solucionar problemas de transacciones y consultas en Spanner. Puedes configurar
etiquetas de transacción y de solicitud con los atributos SPANNER.TRANSACTION_TAG
y
SPANNER.STATEMENT_TAG
variables de sesión.
psql
Java
Go
Node.js
Python
C#
Ejecuta la muestra 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
Recupera datos mediante transacciones de solo lectura
Supongamos que quieres ejecutar más de una lectura en la misma marca de tiempo. En las transacciones de solo lectura, se observa un prefijo coherente del historial de confirmaciones de transacciones, por lo que la aplicación siempre obtiene datos coherentes.
Configura la conexión como de solo lectura o usa el SQL SET TRANSACTION READ ONLY
.
para ejecutar una transacción de solo lectura.
A continuación, se muestra cómo ejecutar una consulta y cómo realizar una lectura en la misma transacción de solo lectura:
psql
Java
Go
Node.js
Python
C#
Ejecuta la muestra 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
Deberías ver un resultado similar a este:
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 particionadas y Data Boost
El partitionQuery
La API divide una consulta en partes más pequeñas, o particiones, y usa varias
para recuperar las particiones en paralelo. Cada partición se identifica con un
token de partición. La API de PartitionQuery tiene una latencia más alta que la estándar
Query API, ya que solo está diseñada para operaciones masivas como exportar o
analizar toda la base de datos.
Data Boost te permite ejecutar consultas de estadísticas y exportaciones de datos con un impacto casi nulo en las cargas de trabajo existentes de la instancia de Spanner aprovisionada. Data Boost solo admite consultas particionadas.
psql
Java
Go
Node.js
Python
C#
Ejecuta la muestra 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
Para obtener más información sobre cómo ejecutar consultas particionadas y usar Data Boost con PGAdapter, consulta Data Boost y sentencias de consulta particionadas.
DML particionado
El lenguaje de manipulación de datos particionado (DML) es diseñados para los siguientes tipos de actualizaciones y eliminaciones masivas:
- Recolección de elementos no usados y limpieza periódicos.
- El restablecimiento de columnas nuevas con valores predeterminados.
psql
Java
Go
Node.js
Python
C#
Ejecuta la muestra 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
Limpieza
Para evitar que se apliquen cargos adicionales a tu cuenta de Google Cloud por los recursos que se usaron en este instructivo, descarta la base de datos y borra la instancia que creaste.
Borra la base de datos
Si borras una instancia, se borrarán de forma automática todas las bases de datos que contiene. En este paso, se muestra cómo borrar una base de datos sin borrar una instancia (ten en cuenta que se seguirán generando cargos por la instancia).
En la línea de comandos
gcloud spanner databases delete example-db --instance=test-instance
Usa la consola de Google Cloud
Ve a la página Instancias de Spanner en la consola de Google Cloud.
Haz clic en la instancia.
Haz clic en la base de datos que deseas borrar.
En la página Detalles de la base de datos, haz clic en Borrar.
Confirma que deseas borrar la base de datos y haz clic en Borrar.
Borra la instancia
Si borras una instancia, se descartarán de forma automática todas las bases de datos creadas en ella.
En la línea de comandos
gcloud spanner instances delete test-instance
Usa la consola de Google Cloud
Ve a la página Instancias de Spanner en la consola de Google Cloud.
Haz clic en tu instancia.
Haz clic en Borrar.
Confirma que deseas borrar la instancia y haz clic en Borrar.
¿Qué sigue?
Obtén información para acceder a Spanner con una instancia de máquina virtual.
Obtén más información sobre las credenciales de autorización y autenticación en Autentícate en servicios de Cloud con bibliotecas cliente.
Obtén más información sobre las prácticas recomendadas para el diseño de esquemas de Spanner.