psql - menyimpan hasil perintah ke file


Jawaban:


479

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

1
apakah saya memanggil ini sebelum \ dt, atau dalam kombinasi? harap sertakan sintaks terima kasih.
pstanton

118
Mengetik \olagi mematikannya.
Carl G

3
Sedihnya, output dari \?tidak pergi ke file. :(
blitzen9872

untuk izin perusual baik Anda yang ditolak mengatakan cobalah menjalankan psql sebagai administrator
Ajay Takur

1
Ya, \o queries-output.txtredirect semua perintah berikut ke file bernama queries-output.txtdan mengetikkan \o(pada prompt psql lagi) mengembalikan perilaku pengalihan ini.
hygull

95

\oPerintah psql sudah dijelaskan oleh jhwist.

Pendekatan alternatif menggunakan COPY TOperintah 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


Saya setuju @helvete, pendekatan yang disajikan di sini memberikan lebih banyak kekuatan bagi pengguna untuk mengonfigurasi output dengan cara yang lebih khusus
Nathan Benton

27

\copyyang 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;

Sangat berguna, terima kasih. Tetapi 'salin' di '... salin ke ...' tidak diperlukan - pada kenyataannya pada versi terakhir ini menyebabkan perintah gagal.
Tom

Tom, saya pikir itu salah ketik. Mengedit pos dengan pos yang berfungsi pada instalasi saya pgsql 8.5ver
Aakash Gupta

Hanya catatan singkat untuk siapa saja yang mencoba menempelkan pernyataan multi-baris setelah \ copy dan mendapatkan kesalahan sintaks yang membingungkan, seperti yang baru saja saya lakukan. Anda harus melanjutkan pada baris yang sama dengan \ copy.
whoasked

Apakah ada cara untuk mematikan \ copy? Saya menemukan bahwa jika saya menjalankan pernyataan seperti pada contoh Anda, dan kemudian saya jalankan, misalnya, pilih * dari pengguna; bahwa itu akan menambahkan hasil ke file terbaru yang saya tentukan bukannya keluaran ke layar. Terima kasih.
raphael75

6

Gunakan parameter o perintah pgsql.

-o, --output = FILENAME mengirim hasil permintaan ke file (atau | pipe)

psql -d DatabaseName -U UserName -c "SELECT * FROM TABLE" -o /root/Desktop/file.txt

3

COPY tablename TO '/tmp/output.csv' DELIMITER ',' CSV HEADER; perintah ini digunakan untuk menyimpan seluruh tabel sebagai csv


Dalam postgres, SALINAN lebih baik diganti oleh \ SALIN untuk menghindari kebutuhan db admin. Dalam jendela menempatkan ini file di C: \ tmp
Jan

3

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


2

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.


1

Saya berasumsi bahwa ada beberapa perintah psql internal untuk ini, tetapi Anda juga bisa menjalankan scriptperintah dari paket util-linux-ng :

DESKRIPSI Script membuat naskah semua yang dicetak pada terminal Anda.


0

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.


  • Simpan konten perintah Anda ke file

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
  • Jalankan perintah

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

  • Lihat / lacak output perintah Anda

cat sqlop

Selesai! Terima kasih! = D


0

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.