psql
adalah front end 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 perintah meta psql
berikut:
- Umum
- Bantuan
- Buffering Kueri
- Masukan/Output
- Kondisional
- Informasi (hanya 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 dari 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 mengelompokkan pernyataan, Anda menggunakan opsi psql -c
. Opsi ini memungkinkan satu atau beberapa pernyataan pengelolaan sesi atau SQL, yang dipisahkan titik koma (;), untuk diteruskan sebagai satu permintaan eksekusi.
Suatu batch dapat mencakup pernyataan yang didukung, dan dapat mencampur DDL, DML, dan DQL.
Batch multi-pernyataan dijalankan dalam satu blok transaksi implisit. Blok transaksi implisit otomatis ditutup 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 mengeksekusi 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 menyisipkan file ke psql
.
Ada dua cara untuk menjalankan perintah COPY
:
Atomik
COPY
Data 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 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.
Aktifkan COPY
non-atomik
Untuk mengaktifkan COPY
non-atomik, kirim perintah berikut sebelum menjalankan operasi
penyalinan.
SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC'
Sintaksis
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 (garis miring terbalik+N) dalam format teks, dan string kosong yang tidak dikutip dalam format CSV. Anda mungkin lebih menyukai string kosong bahkan dalam format teks untuk kasus di mana Anda tidak ingin membedakan {i>null<i} dengan {i>string<i} kosong.
QUOTE
menentukan karakter kutipan yang akan digunakan saat nilai data dikutip. Defaultnya adalah tanda petik ganda. Nilai ini harus berupa karakter tunggal satu byte. Opsi ini hanya diizinkan jika menggunakan format CSV.
ESCAPE
menentukan karakter yang akan muncul sebelum karakter data yang cocok dengan nilai QUOTE
. Defaultnya sama dengan nilai QUOTE
(sehingga karakter kutipan akan bertambah dua kali lipat jika muncul dalam data). Nilai ini harus berupa karakter tunggal satu byte. Opsi ini hanya diizinkan jika menggunakan format CSV.
HEADER
menunjukkan apakah kumpulan data pertama file input adalah header (berisi nama kolom). Default-nya adalah TRUE.
Contoh
Contoh ini mengimpor data dari file berformat teks bernama mydata.txt
ke dalam tabel mytable
. PGAdapter
harus berjalan. Untuk informasi selengkapnya, lihat Memulai PGAdapter.
cat mydata.txt | psql -h localhost -c "COPY mytable FROM STDIN;"
Pada 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 ini 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 jika baris dalam file input tidak menyertakan nilai (atau null) untuk setiap kolom dalam tabel. Salah satu penyebabnya adalah format file CSV yang salah, atau ketidakcocokan antara opsi pembatas yang ditentukan (atau {i>default delimiter<i}) dan pemisah yang sebenarnya dalam file.
Langkah selanjutnya
- Pelajari cara terhubung ke database dialek PostgreSQL dengan
psql
. - Pelajari PGAdapter.