Cómo conectar PGAdapter al emulador

En esta página, se muestra cómo conectar PGAdapter al emulador de Spanner. El emulador se ejecuta de forma local, y puedes usarlo para desarrollar y probar tus aplicaciones sin crear un proyecto de Google Cloud ni una cuenta de facturación. A medida que el emulador solo almacena datos en la memoria, todos los estados (incluidos los datos, el esquema y la configuración) se pierden cuando se reinicia. El emulador ofrece las mismas APIs que el servicio de producción de Spanner y está destinado al desarrollo y las pruebas locales, no a las implementaciones de producción.

Puedes conectar PGAdapter al emulador de tres maneras diferentes:

  • Ejecuta un contenedor de Docker combinado y compilado previamente con PGAdapter y el emulador.
  • Ejecuta el emulador y PGAdapter en tu máquina local.
  • Ejecuta el emulador y PGAdapter en una red de Docker.

Contenedor de Docker combinado

Ejecuta la imagen de Docker compilada previamente que contiene PGAdapter y el emulador. La instancia de PGAdapter en el contenedor de Docker se configura automáticamente para conectarse al emulador en el contenedor.

Inicia el contenedor de Docker con el siguiente comando.

docker pull gcr.io/cloud-spanner-pg-adapter/pgadapter-emulator
docker run -d \
  -p 5432:5432 \
  -p 9010:9010 \
  -p 9020:9020 \
  gcr.io/cloud-spanner-pg-adapter/pgadapter-emulator

No es necesario que especifiques el nombre de un proyecto, instancia o base de datos cuando inicias el contenedor. De forma predeterminada, usará el nombre del proyecto emulator-project y el nombre de la instancia test-instance. PGAdapter crea automáticamente cualquier base de datos a la que te conectes.

Puedes conectarte a PGAdapter y ejecutar sentencias con psql con el siguiente comando.

psql -h localhost -p 5432 -d test-database

La base de datos test-database se crea automáticamente. Ejecuta estas instrucciones para verificar que estés conectado a una base de datos de dialecto de PostgreSQL:

create table my_table (
  id bigint not null primary key,
  value varchar
);
insert into my_table (id, value) values (1, 'One');
select * from my_table;

También puedes conectarte directamente al emulador dentro del contenedor de Docker, por ejemplo, con gcloud CLId.

gcloud config configurations create emulator
gcloud config set auth/disable_credentials true
gcloud config set project emulator-project
gcloud config set api_endpoint_overrides/spanner http://localhost:9020/
gcloud spanner instances list
gcloud spanner databases execute-sql test-database \
  --instance=test-instance \
  --sql="select * from my_table"

Cómo ejecutar el emulador y PGAdapter en tu máquina local

Puedes ejecutar el emulador y PGAdapter en tu máquina local y conectar PGAdapter al emulador con los siguientes comandos.

Primero, inicia el emulador.

gcloud emulators spanner start

Luego, inicia PGAdapter y conéctalo al emulador. Ten en cuenta que debes iniciar PGAdapter como una aplicación de Java en tu máquina local para que pueda acceder al emulador. Si inicias PGAdapter en un contenedor de Docker, no podrá acceder al emulador que se ejecuta en tu host local.

wget https://storage.googleapis.com/pgadapter-jar-releases/pgadapter.tar.gz \
  && tar -xzvf pgadapter.tar.gz
java -jar pgadapter.jar -p emulator-project -i test-instance \
  -c "" \
  -r autoConfigEmulator=true

Los argumentos de línea de comandos adicionales para PGAdapter que se usan para conectarse al emulador son los siguientes:

  • -c "": le indica a PGAdapter que no use ninguna credencial.
  • -r autoConfigEmulator=true: Indica a PGAdapter que se conecte a localhost:9010, que es el host y el puerto predeterminados del emulador. También le indica a PGAdapter que cree automáticamente cualquier base de datos a la que se conecte un usuario. Esto significa que no necesitas crear una base de datos antes de conectarte a ella.

Puedes conectarte a PGAdapter y ejecutar sentencias con psql con el siguiente comando.

psql -h localhost -p 5432 -d test-database

La base de datos test-database se crea automáticamente. Ejecuta estas instrucciones para verificar que estés conectado a una base de datos de dialecto de PostgreSQL:

create table my_table (
  id bigint not null primary key,
  value varchar
);
insert into my_table (id, value) values (1, 'One');
select * from my_table;

Ejecuta el emulador y PGAdapter en una red de Docker

Puedes ejecutar el emulador y PGAdapter en una red de Docker y conectar PGAdapter al emulador con los siguientes comandos.

cat <<EOT > docker-compose.yml
version: "3.9"
services:
  emulator:
    image: "gcr.io/cloud-spanner-emulator/emulator"
    pull_policy: always
    container_name: spanner-emulator
    ports:
      - "9010:9010"
      - "9020:9020"
  pgadapter:
    depends_on:
      emulator:
        condition: service_started
    image: "gcr.io/cloud-spanner-pg-adapter/pgadapter"
    pull_policy: always
    container_name: pgadapter-connected-to-emulator
    command:
      - "-p emulator-project"
      - "-i test-instance"
      - "-r autoConfigEmulator=true"
      - "-e emulator:9010"
      - "-c \"\""
      - "-x"
    ports:
      - "5432:5432"
EOT
docker compose up -d

PGAdapter y el emulador se inician en la misma red de Docker, y PGAdapter está configurado para conectarse al emulador. Los argumentos de línea de comandos adicionales para PGAdapter que se usan para conectarse al emulador son los siguientes:

  • -c "": le indica a PGAdapter que no use ninguna credencial.
  • -r autoConfigEmulator=true: Esto le indica a PGAdapter que cree automáticamente cualquier base de datos a la que se conecte un usuario. Esto significa que no necesitas crear una base de datos antes de conectarte a ella.
  • -e emulator:9010: -e especifica el extremo al que se debe conectar PGAdapter. emulator:9010 es el nombre y el número de puerto del emulador en la misma red de Docker.
  • -x: Permite conexiones a PGAdapter desde tu máquina local.

Puedes conectarte a PGAdapter y ejecutar sentencias con psql con el siguiente comando.

psql -h localhost -p 5432 -d test-database

La base de datos test-database se crea automáticamente. Ejecuta estas instrucciones para verificar que estés conectado a una base de datos de dialecto de PostgreSQL:

create table my_table (
  id bigint not null primary key,
  value varchar
);
insert into my_table (id, value) values (1, 'One');
select * from my_table;

También puedes conectarte directamente al emulador en la red de Docker, por ejemplo, con gcloud CLId.

gcloud config configurations create emulator
gcloud config set auth/disable_credentials true
gcloud config set project emulator-project
gcloud config set api_endpoint_overrides/spanner http://localhost:9020/
gcloud spanner instances list
gcloud spanner databases execute-sql test-database \
  --instance=test-instance \
  --sql="select * from my_table"