Tujuan
Tutorial ini memandu Anda melakukan langkah-langkah berikut menggunakan Spanner Proxy lokal PGAdapter untuk driver PostgreSQL:
- Membuat instance dan database Spanner.
- Menulis, membaca, dan mengeksekusi kueri SQL pada data dalam database.
- Perbarui skema database.
- Mengupdate data menggunakan transaksi baca-tulis.
- Tambahkan indeks sekunder ke database.
- Gunakan indeks untuk membaca dan mengeksekusi kueri SQL pada data.
- Ambil data menggunakan transaksi hanya baca.
Biaya
Tutorial ini menggunakan Spanner, yang merupakan komponen Google Cloud. Untuk mengetahui informasi tentang biaya penggunaan Spanner, lihat Harga.
Sebelum memulai
Selesaikan langkah-langkah yang dijelaskan di bagian Penyiapan, yang mencakup pembuatan dan menetapkan project Google Cloud default, mengaktifkan penagihan, mengaktifkan Cloud Spanner API, dan menyiapkan OAuth 2.0 untuk mendapatkan kredensial autentikasi yang akan digunakan Cloud Spanner API.
Secara khusus, pastikan Anda menjalankan gcloud auth
application-default login
untuk menyiapkan lingkungan pengembangan lokal dengan autentikasi
memiliki kredensial yang lengkap.
Menyiapkan lingkungan PGAdapter lokal Anda
Anda dapat menggunakan driver PostgreSQL bersama dengan PGAdapter untuk terhubung ke Spanner. PGAdapter adalah proxy lokal yang menerjemahkan protokol jaringan PostgreSQL ke Protokol gRPC Spanner.
PGAdapter memerlukan Java atau Docker agar dapat berjalan.
Instal salah satu dari perintah berikut di mesin pengembangan jika belum ada yang sudah terinstal:
Clone repositori aplikasi contoh ke komputer lokal Anda:
git clone https://github.com/GoogleCloudPlatform/pgadapter.git
Ubah ke direktori yang berisi kode contoh 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
Membuat instance
Saat pertama kali menggunakan Spanner, Anda harus membuat instance, yang merupakan alokasi resource yang digunakan oleh database Spanner. Jika Anda buat instance, pilih konfigurasi instance, yang menentukan tempat data disimpan, jumlah node yang digunakan, yang menentukan jumlah resource inferensi dan penyimpanan dalam instance Anda.
Jalankan perintah berikut untuk membuat instance Spanner di region
us-central1
dengan 1 node:
gcloud spanner instances create test-instance --config=regional-us-central1 \
--description="Test Instance" --nodes=1
Perhatikan bahwa tindakan ini akan membuat instance dengan karakteristik berikut:
- ID Instance
test-instance
- Nama tampilan
Test Instance
- Konfigurasi instance
regional-us-central1
(Penyimpanan konfigurasi regional di satu region, sementara konfigurasi multi-region mendistribusikan data di di beberapa region. Untuk informasi lebih lanjut, lihat artikel Tentang instance.) - Jumlah node 1 (
node_count
sesuai dengan jumlah penyaluran dan penyimpanan resource yang tersedia untuk database dalam instance. Pelajari lebih lanjut di Node dan unit pemrosesan.)
Anda akan melihat:
Creating instance...done.
Lihat file contoh
Repositori contoh berisi contoh yang menunjukkan cara menggunakan Spanner dengan PGAdapter.
Lihat foldersamples/snippets
, yang menunjukkan cara menggunakan
Spanner. Kode ini menunjukkan cara membuat dan menggunakan database baru. Data
contoh skema yang ditunjukkan pada
Halaman Model data dan skema.
Memulai PGAdapter
Mulai PGAdapter di mesin pengembangan lokal Anda dan arahkan ke instance yang Anda buat.
Perintah berikut mengasumsikan bahwa Anda telah mengeksekusi
gcloud auth application-default login
.
Aplikasi 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
Tindakan ini memulai PGAdapter dengan Spanner tersemat emulator. Emulator sematan ini otomatis membuat Spanner atau database yang Anda hubungkan tanpa perlu membuat secara manual mereka terlebih dahulu.
Sebaiknya jalankan PGAdapter dalam produksi sebagai file bantuan container atau sebagai dependensi dalam proses. Untuk informasi selengkapnya tentang cara men-deploy PGAdapter dalam produksi, lihat Pilih metode untuk menjalankan PGAdapter.
Buat database
Buat database bernama example-db
dalam instance bernama test-instance
dengan
menjalankan perintah berikut
pada baris perintah.
gcloud spanner databases create example-db --instance=test-instance \
--database-dialect=POSTGRESQL
Anda akan melihat:
Creating database...done.
Membuat tabel
Kode berikut membuat dua tabel dalam database.
psql
Java
Go
Node.js
Python
C#
Jalankan contoh dengan perintah berikut:
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
Langkah selanjutnya adalah menulis data ke database Anda.
Membuat koneksi
Sebelum Anda dapat melakukan operasi baca atau tulis, Anda harus membuat koneksi ke PGAdapter. Semua interaksi Anda dengan Spanner harus diselesaikan melaluiConnection
. Nama database ditetapkan dalam string koneksi.
psql
Java
Go
Node.js
Python
C#
Jalankan contoh dengan perintah berikut:
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
Menulis data dengan DML
Anda dapat menyisipkan data menggunakan Data Manipulation Language (DML) dalam mode baca-tulis saat melakukan transaksi.
Contoh ini menunjukkan cara menjalankan pernyataan DML di Spanner dengan menggunakan {i>driver<i} PostgreSQL.
psql
Java
Go
Node.js
Python
C#
Jalankan contoh dengan perintah berikut:
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
Anda akan melihat respons berikut:
4 records inserted.
Menulis data dengan batch DML
PGAdapter mendukung eksekusi batch DML. Mengirim beberapa DML pernyataan dalam satu batch mengurangi jumlah perjalanan bolak-balik ke Spanner dan meningkatkan performa aplikasi Anda.
psql
Java
Go
Node.js
Python
C#
Jalankan contoh dengan perintah berikut:
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
Anda akan melihat:
3 records inserted.
Menulis data dengan mutasi
Anda juga dapat menyisipkan data menggunakan mutasi.
PGAdapter menerjemahkan perintah COPY
PostgreSQL ke
mutasi. Menggunakan COPY
adalah cara paling efisien untuk menyisipkan data dengan cepat di
dari database Spanner.
Operasi COPY
secara default bersifat atomik. Operasi atomik aktif
Spanner dibatasi oleh batas ukuran commit.
Lihat Batas CRUD untuk informasi selengkapnya.
Contoh ini menunjukkan cara menjalankan operasi COPY
non-atomik. Hal ini memungkinkan
operasi COPY
untuk melampaui batas ukuran commit.
psql
Java
Go
Node.js
Python
C#
Jalankan contoh dengan perintah berikut:
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
Anda akan melihat:
Copied 5 singers
Copied 5 albums
Membuat kueri data menggunakan SQL
Spanner mendukung antarmuka SQL untuk membaca data, yang dapat akses pada command line menggunakan Google Cloud CLI atau secara terprogram menggunakan {i>driver<i} PostgreSQL.
Di command line
Jalankan pernyataan SQL berikut untuk membaca nilai semua kolom dari
Tabel Albums
:
gcloud spanner databases execute-sql example-db --instance=test-instance \
--sql='SELECT singer_id, album_id, album_title FROM albums'
Hasilnya seharusnya:
SingerId AlbumId AlbumTitle
1 1 Total Junk
1 2 Go, Go, Go
2 1 Green
2 2 Forever Hold Your Peace
2 3 Terrified
Menggunakan driver PostgreSQL
Selain menjalankan pernyataan SQL pada baris perintah, Anda dapat mengeluarkan pernyataan SQL yang sama secara terprogram menggunakan {i>driver<i} PostgreSQL.
psql
Java
Go
Node.js
Python
C#
Jalankan contoh dengan perintah berikut:
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
Anda akan melihat hasil berikut:
1 1 Total Junk
1 2 Go, Go, Go
2 1 Green
2 2 Forever Hold Your Peace
2 3 Terrified
Membuat kueri menggunakan parameter SQL
Jika aplikasi Anda memiliki kueri yang sering dieksekusi, Anda dapat meningkatkan performanya dengan membuat parameternya. Hasil kueri parametrik bisa di-cache dan digunakan kembali, yang mengurangi biaya kompilasi. Untuk informasi selengkapnya, lihat Gunakan parameter kueri untuk mempercepat kueri yang sering dijalankan.
Berikut adalah contoh penggunaan parameter dalam klausa WHERE
untuk
data kueri yang berisi nilai tertentu untuk LastName
.
psql
Java
Go
Node.js
Python
C#
Jalankan contoh dengan perintah berikut:
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
Anda akan melihat hasil berikut:
12 Melissa Garcia
Memperbarui skema database
Asumsikan Anda perlu menambahkan kolom baru bernama MarketingBudget
ke Albums
tabel sementara. Menambahkan kolom baru ke tabel yang ada membutuhkan pembaruan pada
skema database. Spanner mendukung pembaruan skema pada database, sedangkan
{i>database<i} terus melayani
traffic. Pembaruan skema tidak perlu mengambil
{i>database<i} secara {i>offline<i} dan mereka tidak
mengunci seluruh tabel atau kolom; Anda bisa melanjutkan
menulis data ke {i>database<i} selama pembaruan skema. Baca selengkapnya tentang data yang didukung
pembaruan skema dan
performa perubahan skema dalam
Buat pembaruan skema.
Menambahkan kolom
Anda dapat menambahkan kolom pada baris perintah menggunakan Google Cloud CLI atau secara terprogram menggunakan {i>driver<i} PostgreSQL.
Di command line
Gunakan perintah ALTER TABLE
berikut untuk
tambahkan kolom baru ke tabel:
gcloud spanner databases ddl update example-db --instance=test-instance \
--ddl='ALTER TABLE albums ADD COLUMN marketing_budget BIGINT'
Anda akan melihat:
Schema updating...done.
Menggunakan driver PostgreSQL
Jalankan pernyataan DDL menggunakan {i>driver<i} PostgreSQL untuk mengubah skema:
psql
Java
Go
Node.js
Python
C#
Jalankan contoh dengan perintah berikut:
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
Anda akan melihat:
Added marketing_budget column
Menjalankan batch DDL
Sebaiknya jalankan beberapa modifikasi skema dalam satu batch.
Anda dapat mengeksekusi beberapa pernyataan DDL dalam satu batch menggunakan
fitur pengelompokan driver PostgreSQL Anda, dengan mengirimkan semua DDL
pernyataan sebagai satu {i>string<i} SQL yang dipisahkan dengan titik koma, atau dengan menggunakan
Pernyataan START BATCH DDL
dan RUN BATCH
.
psql
Java
Go
Node.js
Python
C#
Jalankan contoh dengan perintah berikut:
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
Anda akan melihat:
Added venues and concerts tables
Menulis data ke kolom baru
Kode berikut menulis data ke kolom baru. MarketingBudget
ditetapkan ke
100000
untuk baris yang dikunci oleh Albums(1, 1)
dan ke 500000
untuk baris yang dikunci
paling lambat Albums(2, 2)
.
COPY
PostgreSQL ke
mutasi. Perintah COPY
secara default diterjemahkan ke mutasi Insert
.
Menjalankan set spanner.copy_upsert=true
untuk menerjemahkan perintah COPY
ke
InsertOrUpdate
mutasi. Ini dapat digunakan untuk memperbarui data yang ada di
Spanner.
psql
Java
Go
Node.js
Python
C#
Jalankan contoh dengan perintah berikut:
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
Anda akan melihat:
Updated 2 albums
Anda juga dapat menjalankan kueri SQL untuk mengambil nilai yang baru saja ditulis.
Berikut adalah kode untuk mengeksekusi kueri:
psql
Java
Go
Node.js
Python
C#
Jalankan kueri dengan perintah ini:
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
Anda akan melihat:
1 1 100000
1 2 null
2 1 null
2 2 500000
2 3 null
Perbarui data
Anda dapat memperbarui data menggunakan DML dalam transaksi baca-tulis.
psql
Java
Go
Node.js
Python
C#
Jalankan contoh dengan perintah berikut:
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
Anda akan melihat:
Transferred marketing budget from Album 2 to Album 1
Tag transaksi dan tag permintaan
Menggunakan tag transaksi dan tag permintaan
untuk memecahkan masalah transaksi dan kueri di Spanner. Anda dapat mengatur
tag transaksi dan tag permintaan dengan SPANNER.TRANSACTION_TAG
dan
Variabel sesi SPANNER.STATEMENT_TAG
.
psql
Java
Go
Node.js
Python
C#
Jalankan contoh dengan perintah berikut:
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
Mengambil data menggunakan transaksi hanya baca
Misalkan Anda ingin mengeksekusi lebih dari satu pembacaan pada stempel waktu yang sama. Hanya-baca
transaksi mengamati
dari histori commit transaksi, sehingga aplikasi Anda akan selalu mendapatkan
data yang konsisten.
Tetapkan koneksi ke hanya baca atau gunakan SET TRANSACTION READ ONLY
SQL
untuk mengeksekusi
transaksi hanya baca.
Yang berikut ini menunjukkan cara menjalankan kueri dan melakukan pembacaan dalam metode read-only transaksi:
psql
Java
Go
Node.js
Python
C#
Jalankan contoh dengan perintah berikut:
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
Anda akan melihat output yang mirip dengan:
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
Kueri yang dipartisi dan Peningkatan Data
partitionQuery
API membagi kueri menjadi bagian-bagian yang lebih kecil, atau partisi, dan menggunakan beberapa
untuk mengambil partisi secara paralel. Setiap partisi diidentifikasi oleh sebuah
token partisi. PartitionQuery API memiliki latensi yang lebih tinggi daripada standar
query API, karena hanya ditujukan untuk operasi massal seperti mengekspor atau
memindai seluruh {i>database<i}.
Pengoptimalan Data memungkinkan Anda menjalankan kueri analisis dan ekspor data dengan hampir nol terhadap workload yang ada pada instance Spanner yang disediakan. Peningkatan Data hanya mendukung kueri yang dipartisi.
psql
Java
Go
Node.js
Python
C#
Jalankan contoh dengan perintah berikut:
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
Untuk mengetahui informasi selengkapnya tentang cara menjalankan kueri yang dipartisi dan menggunakan Peningkatan Data dengan PGAdapter, lihat: Peningkatan Data dan pernyataan kueri yang dipartisi
DML yang dipartisi
Partitioned Data Manipulation Language (DML) adalah dirancang untuk jenis update dan penghapusan massal berikut:
- Pembersihan berkala dan pembersihan sampah memori.
- Mengisi ulang kolom baru dengan nilai default.
psql
Java
Go
Node.js
Python
C#
Jalankan contoh dengan perintah berikut:
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
Pembersihan
Agar tidak menimbulkan biaya tambahan ke akun Penagihan Cloud Anda untuk resource yang digunakan dalam tutorial ini, letakkan database dan hapus instance yang yang Anda buat.
Menghapus database
Jika sebuah instance dihapus, semua database di dalamnya akan otomatis dihapus. Langkah ini menunjukkan cara menghapus {i>database<i} tanpa menghapus sebuah instance (Anda akan masih dikenakan biaya untuk instance).
Di command line
gcloud spanner databases delete example-db --instance=test-instance
Menggunakan konsol Google Cloud
Buka halaman Spanner Instances di Konsol Google Cloud.
Klik instance tersebut.
Klik database yang ingin dihapus.
Di halaman Database details, klik Delete.
Konfirmasi bahwa Anda ingin menghapus database, lalu klik Delete.
Menghapus instance
Jika instance dihapus, semua database yang dibuat dalam instance tersebut akan otomatis hilang.
Di command line
gcloud spanner instances delete test-instance
Menggunakan konsol Google Cloud
Buka halaman Spanner Instances di Konsol Google Cloud.
Klik instance Anda.
Klik Hapus.
Konfirmasi bahwa Anda ingin menghapus instance, lalu klik Delete.
Langkah selanjutnya
Pelajari cara mengakses Spanner dengan instance virtual machine.
Pelajari otorisasi dan kredensial autentikasi di Mengautentikasi ke Layanan cloud yang menggunakan library klien.
Pelajari Praktik terbaik desain skema Spanner lebih lanjut.