\copy
bisa menggunakan tabel sementara.
Pertama saya menguji dan mengkonfirmasi ini dengan versi 9.0 di baris perintah.
Kemudian saya membuat file dengan perintah meta SQL dan psql \copy
menggunakan beberapa tabel sementara. Itu juga berhasil bagi saya.
CREATE TEMP TABLE tmp as SELECT * FROM tbl;
\copy (SELECT * FROM tmp JOIN tbl USING (id)) TO '/var/lib/postgres/test1.csv';
Panggilan:
psql -p5432 mydb -f test.sql
Perhatikan titik koma terminating, yang merupakan opsional pada akhir file (diakhiri secara implisit), tetapi diperlukan setelah pernyataan SQL lainnya dan juga setelah yang terakhir jika dijalankan dalam psql secara interaktif.
Biasanya , perintah meta psql tidak dapat dicampur dengan SQL pada baris yang sama dalam file yang dieksekusi per psql -f
. Saya mengutip manual pada psql :
Parsing untuk argumen berhenti di akhir baris, atau ketika backslash lain yang tidak dikutip ditemukan. Garis miring terbalik yang diambil sebagai awal dari meta-command baru. Urutan khusus \\
(dua garis miring terbalik) menandai akhir dari argumen dan melanjutkan penguraian perintah SQL, jika ada. Dengan begitu perintah SQL dan psql dapat secara bebas dicampur pada satu baris. Namun dalam kasus apa pun, argumen dari sebuah meta-command tidak dapat berlanjut melampaui akhir baris.
Namun, aturan yang berbeda berlaku setelahnya \copy
. Pada dasarnya, psql beralih kembali ke mode SQL secara otomatis setelah \copy
Lihat:
Tetapi Anda menulis bahwa Anda memiliki semua perintah pada baris yang berbeda. Jadi itu tidak bisa menjadi penjelasan dalam kasus Anda.
Selain itu, sudahkah Anda mempertimbangkan untuk menggunakan COPY
( perintah SQL ) alih-alih \copy
( psql meta-command )?
Tentu saja, file target harus lokal ke server, bukan klien dalam kasus ini. Dan hak istimewa file yang berbeda berlaku. Manual :
File yang disebutkan dalam COPY
perintah dibaca atau ditulis langsung oleh server, bukan oleh aplikasi klien. Oleh karena itu, mereka harus berada di atau dapat diakses oleh mesin server database, bukan klien. Mereka harus dapat diakses dan dibaca atau ditulis oleh pengguna PostgreSQL (ID pengguna yang dijalankan oleh server), bukan klien.