alat command line psql

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

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