psql - menyimpan hasil perintah ke file

284

Saya menggunakan psql \dtuntuk mendaftar semua tabel dalam database dan saya perlu menyimpan hasilnya.

Apa sintaks untuk mengekspor hasil perintah psql ke file?

pstanton
sumber
1
Lihat juga stackoverflow.com/questions/3939329/… .
Matt Solnit

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
jhwist
sumber
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

Intgr
sumber
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;
Aakash Gupta
sumber
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
Yavuz
sumber
3

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

Stephen
sumber
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

Daniil Mashkin
sumber
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.

Er.Ankit H Gandhi
sumber
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.

hlovdal
sumber
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

Eduardo Lucio
sumber
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
Roman Rhrn Nesterov
sumber