Substitusi variabel dalam psql saat menggunakan \ copy

8

Saya menggunakan perintah psql \ copy dan saya ingin mengirimkan variabel ke sana dari shell (untuk nama tabel) seperti yang telah saya lakukan ketika membuat skrip query. Saya telah membaca dalam dokumentasi untuk psql bahwa:

Sintaks perintah mirip dengan perintah SQL COPY. Perhatikan bahwa, karena ini, aturan penguraian khusus berlaku untuk perintah \ copy. Secara khusus, aturan substitusi variabel dan lolos backslash tidak berlaku.

Ini tampaknya cukup definitif, namun saya ingin tahu apakah ada yang tahu solusinya?

beacon_bonanza
sumber

Jawaban:

4

Anda dapat menghindari batasan ini dengan memipipkan seluruh perintah ke psql:

echo "\copy tbl FROM '/path/to/myfile.pgsql'" | psql mydb
Erwin Brandstetter
sumber
2

Catatan: Saya menemukan masalah ini sendiri di MS Windows dan saya sudah punya sesuatu untuk dimasukkan ke dalam psql menggunakan stdin-nya. Saya harus menggabungkan input. Dan di situlah ia menjadi sangat rumit. Saya pikir untuk berbagi sesuatu yang agak berharga dalam contoh pendapat saya, selain jawaban Erwin, jadi saya mempostingnya di sini sebagai jawaban kalau-kalau ada orang lain yang juga perlu "menggunakan variabel" dengan \copysaat memasukkan data ke stdin pada platform Windows.

Jika Anda ingin menyalin beberapa data dari stdin dan menggunakan "variabel" untuk \copypada saat yang sama, semuanya mungkin menjadi rumit dengan tanda kurung keluar. Di bawah ini adalah contoh bagaimana hal itu dapat dilakukan. Catat pelarian tiga tanda (sic!) Untuk tanda kurung yang menyertakan nama kolom

@echo off
set TBL=wd
(
 echo truncate %TBL%;
 echo \copy %TBL% (depth,path,name,created,accessed,modified,size^^^) from stdin csv
 C:\msys64\usr\bin\find ^
  "e:/somepath" ^
  -type f -printf "%%d,\"%%h\",\"%%f\",\"%%t\",\"%%a\",\"%%c\",%%s\n"
) | "C:\Program Files\PostgreSQL\9.4\bin\psql.exe" -h some.server -U user dbname
mlt
sumber