將 PGAdapter 連線至模擬器

本頁面說明如何將 PGAdapter 連結至 Spanner 模擬器。模擬器會在本機執行,您可以使用它開發及測試應用程式,而無須建立Google Cloud 專案或帳單帳戶。由於模擬器只會在記憶體中儲存資料,因此重新啟動時,所有狀態 (包括資料、結構定義和設定) 都會遺失。模擬器提供的 API 與 Spanner 正式版服務相同,適用於本機開發和測試,而非正式部署。

您可以透過三種方式將 PGAdapter 連線至模擬器:

  • 使用 PGAdapter 和模擬器執行預先建構的結合式 Docker 容器。
  • 在本機電腦上同時執行模擬器和 PGAdapter。
  • 在 Docker 網路中同時執行模擬器和 PGAdapter。

結合 Docker 容器

執行預先建構的 Docker 映像檔,其中包含 PGAdapter 和模擬器。Docker 容器中的 PGAdapter 例項會自動設定連線至容器中的模擬器。

使用下列指令啟動 Docker 容器。

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

啟動容器時,您不需要指定專案、執行個體或資料庫名稱。根據預設,系統會使用專案名稱 emulator-project 和執行個體名稱 test-instance。您連線的任何資料庫都會由 PGAdapter 自動建立。

您可以使用下列指令,連線至 PGAdapter,並透過 psql 執行陳述式。

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

系統會自動建立資料庫 test-database。執行下列陳述式,確認您已連線至 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;

您也可以直接連線至 Docker 容器中的模擬器,例如使用 gcloud CLI。

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"

在本機電腦上執行模擬器和 PGAdapter

您可以在本機電腦上執行模擬器和 PGAdapter,並使用下列指令將 PGAdapter 連線至模擬器。

首先啟動模擬器。

gcloud emulators spanner start

接著啟動 PGAdapter,並將其連結至模擬器。請注意,您必須在本機電腦上以 Java 應用程式形式啟動 PGAdapter,才能存取模擬器。如果您在 Docker 容器中啟動 PGAdapter,就無法存取在本機主機上執行的模擬器。

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

用於連線至模擬器的 PGAdapter 額外指令列引數如下:

  • -c "":這會指示 PGAdapter 不要使用任何憑證。
  • -r autoConfigEmulator=true:這會指示 PGAdapter 連線至 localhost:9010,這是預設的模擬器主機和通訊埠。並指示 PGAdapter 自動建立使用者連線的任何資料庫。也就是說,您不需要先建立資料庫,再連線。

您可以使用下列指令,連線至 PGAdapter,並透過 psql 執行陳述式。

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

系統會自動建立資料庫 test-database。執行下列陳述式,確認您已連線至 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;

在 Docker 網路中執行模擬器和 PGAdapter

您可以在 Docker 網路中執行模擬器和 PGAdapter,並使用下列指令將 PGAdapter 連線至模擬器。

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 和模擬器會在相同的 Docker 網路中啟動,且 PGAdapter 會設為連線至模擬器。用於連線至模擬器的 PGAdapter 額外命令列引數如下:

  • -c "":這會指示 PGAdapter 不要使用任何憑證。
  • -r autoConfigEmulator=true:這會指示 PGAdapter 自動建立使用者連線的任何資料庫。也就是說,您不需要先建立資料庫,再連線。
  • -e emulator:9010-e 會指定 PGAdapter 應連線的端點。emulator:9010 是同一個 Docker 網路中模擬器的名稱和通訊埠號碼。
  • -x:允許從本機連線至 PGAdapter。

您可以使用下列指令,連線至 PGAdapter,並透過 psql 執行陳述式。

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

系統會自動建立資料庫 test-database。執行下列陳述式,確認您已連線至 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;

您也可以直接連線至 Docker 網路中的模擬器,例如使用 gcloud CLI。

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"