Solusi dalam jawaban yang diterima hanya akan berfungsi di server dan saat pengguna menjalankan kueri akan memiliki izin untuk membaca file seperti yang dijelaskan dalam jawaban SO ini.
Jika tidak, pendekatan yang lebih fleksibel adalah mengganti COPY
SQL perintah dengan psql
"meta-command" yang disebut \copy
yang mengambil semua opsi yang sama dengan COPY "nyata", tetapi dijalankan di dalam klien (tanpa memerlukan ;
di akhir):
psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv"
Sesuai dokumen, \copy
perintah:
Melakukan penyalinan frontend (klien). Ini adalah operasi yang menjalankan perintah SQL COPY, tetapi alih-alih server membaca atau menulis file yang ditentukan, psql membaca atau menulis file dan merutekan data antara server dan sistem file lokal. Ini berarti bahwa aksesibilitas dan hak istimewa file adalah milik pengguna lokal, bukan server, dan tidak diperlukan hak istimewa pengguna super SQL.
Selain itu, jika the_file.csv
berisi header di baris pertama, dapat dikenali dengan menambahkan header
di akhir perintah di atas:
psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv header"
Sebagaimana dinyatakan dalam Dokumentasi PostgreSQL (II. Aplikasi Klien PostgreSQL - psql) Anda dapat meneruskan perintah ke psql
(terminal interaktif PostgreSQL) dengan sakelar -c
. Pilihan Anda adalah:
1, CSV sisi klien:\copy
meta-perintah
melakukan SQL COPY
perintah tetapi file dibaca di klien dan konten dialihkan ke server.
psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv"
(opsi sisi klien awalnya disebutkan dalam jawaban ini)
2. CSV sisi server:SQL COPY
perintah
membaca file di server (pengguna saat ini harus memiliki izin yang diperlukan):
psql -c "COPY tbname FROM '/tmp/the_file.csv' delimiter '|' csv;"
peran DB yang diperlukan untuk membaca file di server:
COPY
penamaan file atau perintah hanya diperbolehkan untuk pengguna super database yang diberikan salah satu peran defaultpg_read_server_files
,pg_write_server_files
, ataupg_execute_server_program
juga proses server PostgreSQL perlu memiliki akses ke file.
Cara yang paling fleksibel adalah dengan menggunakan shell HERE document
, yang memungkinkan Anda menggunakan variabel shell di dalam kueri, bahkan di dalam tanda kutip (ganda atau tunggal):
#!/bin/sh
THE_USER=moi
THE_DB=stuff
THE_TABLE=personnel
PSQL=/opt/postgresql/bin/psql
THE_DIR=/tmp
THE_FILE=the_file.csv
${PSQL} -U ${THE_USER} ${THE_DB} <<OMG
COPY ${THE_TABLE} FROM '${THE_DIR}/${THE_FILE}' delimiter '|' csv;
OMG
Untuk melengkapi jawaban sebelumnya, saya menyarankan:
psql -d your_dbname --user=db_username -c "COPY tbname FROM '/tmp/the_file.csv' delimiter '|' csv;"