alat command line psql

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 Atomik

    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-atomik

    COPY 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 operasi COPY 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