psql
adalah frontend command line untuk PostgreSQL. Halaman ini menjelaskan perintah psql
yang didukung antarmuka PostgreSQL untuk Spanner. Untuk mempelajari cara
terhubung dengan psql
, lihat
Menghubungkan psql ke database dialek PostgreSQL.
Perintah meta
Antarmuka PostgreSQL mendukung kategori meta-perintah psql
berikut:
- Umum
- Bantuan
- Buffer Kueri
- Input/Output
- Kondisional
- Informasi (khusus beberapa perintah \d)
- Pemformatan
- Sistem Operasi
- Variabel
Kategori berikut tidak didukung:
- Koneksi
- Objek Besar
Perintah informasi berikut didukung:
Perintah | Deskripsi |
---|---|
\d | Mencantumkan tabel (tidak termasuk tabel sistem) |
\d table | Mencantumkan kolom tabel |
\dt | Mencantumkan tabel di semua skema (mendetail) |
\dt table | Tabel daftar (mendetail) |
\dn | Mencantumkan skema |
Pernyataan pengelolaan sesi
psql
berkomunikasi dengan Spanner melalui PGAdapter,
yang menggunakan mesin inti driver JDBC Spanner. Driver
mendukung pernyataan pengelolaan sesi yang dijelaskan dalam
Pernyataan pengelolaan sesi.
Oleh karena itu, Anda dapat menggunakan pernyataan ini dengan psql
.
Pengelompokan pernyataan SQL
psql
dan PGAdapter mendukung batch SQL multi-pernyataan. Untuk membuat batch pernyataan, Anda menggunakan
opsi psql -c
. Opsi ini memungkinkan satu atau beberapa pernyataan SQL atau pengelolaan sesi, yang dipisahkan dengan titik koma (;), diteruskan sebagai satu permintaan eksekusi.
Batch dapat menyertakan pernyataan apa pun yang didukung, dan dapat menggabungkan DDL, DML, dan DQL.
Batch multi-pernyataan dijalankan dalam satu blok transaksi implisit. Blok transaksi implisit ditutup secara otomatis di akhir batch. Jika terjadi error di dalam blok transaksi implisit, seluruh transaksi akan di-roll back.
Kontrol transaksi BEGIN
dan
COMMIT
eksplisit didukung, tetapi blok transaksi eksplisit
tidak boleh berisi pernyataan DDL.
Contoh
DML
Contoh berikut menunjukkan cara mengirimkan batch pernyataan INSERT
.
psql -h localhost -p 5432 -c "INSERT INTO users (id, age, firstname) VALUES (1, 25, 'Alex'); \
INSERT INTO users (id, age, firstname) VALUES (2, 31, 'Dana'); \
INSERT INTO users (id, age, firstname) VALUES (3, 54, 'Izumi');"
Contoh berikutnya menunjukkan cara menjalankan pernyataan SQL dalam file insert_contacts.sql
.
psql -h localhost -c "$(cat contacts_insert.sql)"
DDL
Contoh ini mengirimkan batch pernyataan ALTER TABLE
.
psql -h localhost -p 5432 test-db -c "ALTER TABLE users ADD col1 integer; \
ALTER TABLE users ADD col2 text; ALTER TABLE users ADD col3 float8;"
Perintah COPY untuk mengimpor data
Gunakan perintah COPY FROM STDIN
untuk mengimpor data dari file teks atau CSV ke database dialek PostgreSQL. Meskipun hanya STDIN yang didukung, Anda dapat mengimpor menggunakan COPY
dengan menyalurkan file ke psql
.
Ada dua cara untuk menjalankan perintah COPY
:
COPY
AtomikData disalin dalam satu transaksi. Ini adalah setelan defaultnya. Batas transaksi standar Spanner berlaku untuk transaksi. Artinya,maksimal 80.000 mutasi atau 100 MB data dapat disertakan dalam satu operasi
COPY
.COPY
non-atomikCOPY
secara otomatis membagi data ke dalam beberapa transaksi jika file berisi lebih dari 80.000 mutasi atau lebih dari 100 MB.Jika terjadi error selama
COPY
dan operasi dibatalkan, beberapa baris mungkin sudah dipertahankan ke database. Tidak ada rollback yang terjadi. Transaksi dijalankan secara paralel, sehingga data setelah baris dalam file impor yang menyebabkan error dapat diimpor ke database sebelum operasiCOPY
dihentikan.
Mengaktifkan COPY
non-atomik
Untuk mengaktifkan COPY
non-atomik, kirimkan perintah berikut sebelum menjalankan operasi
salin.
SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC'
Sintaks
COPY table_name [ ( column_name [, ...] ) ] FROM STDIN [ [ WITH ] ( option [, ...] ) ] where option is one of: FORMAT format_name DELIMITER 'delimiter_character' NULL 'null_string' QUOTE 'quote_character' ESCAPE 'escape_character' HEADER [boolean] and format_name is: {text|csv} and delimiter_character is: [!-~] except ' " \ and null_string is: {a—z|A—Z|0—9|_}+ and quote_character is: [!-~] except ' " \ and escape_character is: [!-~] except ' " \ and boolean is: {TRUE|ON|1|FALSE|OFF|0}
Tabel harus sudah ada. Jika tidak ada daftar kolom yang ditentukan, semua kolom tabel akan disalin.
Default untuk FORMAT
adalah text
.
delimiter_character harus berupa karakter satu byte. Defaultnya adalah karakter Tab untuk format teks dan koma untuk format CSV.
NULL
menentukan string yang mewakili nilai null. Defaultnya adalah \N (backslash+N) dalam format teks, dan string kosong tanpa tanda petik dalam format CSV. Anda mungkin lebih memilih string kosong bahkan dalam format teks jika tidak ingin membedakan null dari string kosong.
QUOTE
menentukan karakter tanda petik yang akan digunakan saat nilai data diapit tanda petik. Defaultnya adalah tanda petik ganda. Karakter ini harus berupa satu karakter satu byte. Opsi ini hanya diizinkan saat menggunakan format CSV.
ESCAPE
menentukan karakter yang akan muncul sebelum karakter data yang cocok dengan nilai QUOTE
. Nilai default-nya sama dengan nilai QUOTE
(sehingga karakter tanda petik akan digandakan jika muncul dalam data). Karakter ini harus berupa satu karakter satu byte. Opsi ini hanya diizinkan saat menggunakan format CSV.
HEADER
menunjukkan apakah data pertama file input adalah header (berisi nama kolom). Defaultnya adalah BENAR.
Contoh
Contoh ini mengimpor data dari file berformat teks bernama mydata.txt
ke tabel mytable
. PGAdapter
harus berjalan. Untuk mengetahui informasi selengkapnya, lihat Memulai PGAdapter.
cat mydata.txt | psql -h localhost -c "COPY mytable FROM STDIN;"
Dalam contoh berikutnya, mydata.csv
dalam format CSV dan baris pertamanya adalah header dengan
nama kolom yang dipisahkan koma.
cat mydata.csv | psql -h localhost \
-c "COPY mytable FROM STDIN WITH (FORMAT csv, ESCAPE '~', HEADER TRUE);"
Contoh berikutnya menunjukkan cara memulai operasi COPY
non-atomik.
cat mydata.txt | psql -h localhost \
-c "SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC'" -c "COPY mytable FROM STDIN;"
Pemecahan masalah
Berikut adalah beberapa error umum.
Sintaksis input tidak valid
Terjadi error berikut:
Invalid input syntax for type <type>:"<table_name>"
Error ini dapat terjadi jika file input memiliki baris header dengan nama kolom dan
opsi HEADER
tidak ditentukan.
Data COPY tidak valid
Terjadi error berikut:
Invalid COPY data: Row length mismatched. Expected <number> columns, but only found <number>
Error ini terjadi saat baris dalam file input tidak menyertakan nilai (atau null) untuk setiap kolom dalam tabel. Salah satu penyebabnya mungkin file CSV yang salah format, atau ketidakcocokan antara opsi pemisah yang ditentukan (atau pemisah default) dan pemisah sebenarnya dalam file.
Langkah selanjutnya
- Pelajari cara terhubung ke database dialek PostgreSQL dengan
psql
. - Pelajari PGAdapter.