Jawaban:
Dari bantuan psql ( \?
):
\ o [FILE] mengirim semua hasil permintaan ke file atau | pipe
Urutan perintah akan terlihat seperti ini:
[wist@scifres ~]$ psql db
Welcome to psql 8.3.6, the PostgreSQL interactive terminal
db=>\o out.txt
db=>\dt
db=>\q
\o
lagi mematikannya.
\?
tidak pergi ke file. :(
\o queries-output.txt
redirect semua perintah berikut ke file bernama queries-output.txt
dan mengetikkan \o
(pada prompt psql lagi) mengembalikan perilaku pengalihan ini.
\o
Perintah psql sudah dijelaskan oleh jhwist.
Pendekatan alternatif menggunakan COPY TO
perintah untuk menulis langsung ke file di server. Ini memiliki keuntungan bahwa itu dibuang dalam format yang mudah diurai pilihan Anda - daripada format tabulasi psql. Ini juga sangat mudah untuk diimpor ke tabel / database lain menggunakan COPY FROM
.
NB! Ini membutuhkan hak superuser dan akan menulis ke file di server .
Contoh: COPY (SELECT foo, bar FROM baz) TO '/tmp/query.csv' (format csv, delimiter ';')
Membuat file CSV dengan ';' sebagai pemisah bidang.
Seperti biasa, lihat dokumentasi untuk detailnya
\copy
yang merupakan perintah postgres dapat bekerja untuk setiap pengguna. Tidak tahu apakah itu berfungsi untuk \ dt atau tidak, tetapi sintaksis umum direproduksi dari tautan berikut Sintaks penyalinan Postgres SQL
\copy (select * from tempTable limit 100) to 'filenameinquotes' with header delimiter as ','
Di atas akan menyimpan output dari kueri pemilihan dalam nama file yang disediakan sebagai file csv
EDIT:
Untuk server psql saya, perintah berikut berfungsi ini adalah versi yang lebih lama v8.5
copy (select * from table1) to 'full_path_filename' csv header;
Jika Anda mendapat kesalahan berikut
ufgtoolspg=> COPY (SELECT foo, bar FROM baz) TO '/tmp/query.csv' (format csv, delimiter ';')
;
ERROR: must be superuser to COPY to or from a file
HINT: Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.
Anda dapat menjalankannya dengan cara ini:
psql somepsqllink_or_credentials -c "COPY (SELECT foo, bar FROM baz) TO STDOUT (format csv, delimiter ';')" > baz.csv
Gunakan kueri di bawah ini untuk menyimpan hasil dalam file csv
\ salin (kueri Anda) ke tajuk csv 'jalur file';
Contoh
\ copy (pilih nama, date_order dari purchase_order) ke tajuk cvs '/home/ankit/Desktop/result.csv';
Semoga ini bisa membantu Anda.
Saya berasumsi bahwa ada beberapa perintah psql internal untuk ini, tetapi Anda juga bisa menjalankan script
perintah dari paket util-linux-ng :
DESKRIPSI Script membuat naskah semua yang dicetak pada terminal Anda.
Pendekatan ini akan bekerja dengan perintah psql apa pun dari yang paling sederhana hingga yang paling rumit tanpa memerlukan perubahan atau penyesuaian apa pun dari perintah aslinya.
CATATAN: Untuk server Linux.
MODEL
read -r -d '' FILE_CONTENT << 'HEREDOC'
[COMMAND_CONTENT]
HEREDOC
echo -n "$FILE_CONTENT" > sqlcmd
CONTOH
read -r -d '' FILE_CONTENT << 'HEREDOC'
DO $f$
declare
curid INT := 0;
vdata BYTEA;
badid VARCHAR;
loc VARCHAR;
begin
FOR badid IN SELECT some_field FROM public.some_base LOOP
begin
select 'ctid - '||ctid||'pagenumber - '||(ctid::text::point) [0]::bigint
into loc
from public.some_base where some_field = badid;
SELECT file||' '
INTO vdata
FROM public.some_base where some_field = badid;
exception
when others then
raise notice 'Block/PageNumber - % ',loc;
raise notice 'Corrupted id - % ', badid;
--return;
end;
end loop;
end;
$f$;
HEREDOC
echo -n "$FILE_CONTENT" > sqlcmd
MODEL
sudo -u postgres psql [some_db] -c "$(cat sqlcmd)" >>sqlop 2>&1
CONTOH
sudo -u postgres psql some_db -c "$(cat sqlcmd)" >>sqlop 2>&1
cat sqlop
Selesai! Terima kasih! = D
Pendekatan untuk buruh pelabuhan
melalui perintah psql
docker exec -i %containerid% psql -U %user% -c '\dt' > tables.txt
atau permintaan dari file sql
docker exec -i %containerid% psql -U %user% < file.sql > data.txt