psql - komut sonuçlarını bir dosyaya kaydet


Yanıtlar:


479

Psql'nin yardımından ( \?):

\ o [FILE] tüm sorgu sonuçlarını dosyaya veya | pipe'a gönder

Komut dizisi şöyle görünecektir:

[wist@scifres ~]$ psql db
Welcome to psql 8.3.6, the PostgreSQL interactive terminal

db=>\o out.txt
db=>\dt
db=>\q

1
bunu \ dt'den önce veya birlikte mi arayabilirim? lütfen sözdizimi ekleyin teşekkürler.
— Mart'ta pstanton

118
\oTekrar yazmak onu kapatır.
— Carl G

3
Ne yazık ki, çıktı \?dosyaya gitmez. :(
— blitzen9872

senin tür alışılmadık izin reddedildi diyor psql yönetici olarak çalıştırmayı deneyin
— Ajay Takur

1
Evet, \o queries-output.txtsonraki tüm o / p komutlarını adlı dosyaya yönlendirir queries-output.txtve yazarak \o( tekrar psql isteminde) bu yönlendirme davranışını geri alır.
— hygull

95

Psql'in \okomut zaten jhwist tarafından tarif edilmiştir.

Alternatif bir yaklaşım, COPY TOdoğrudan sunucudaki bir dosyaya yazmak için komutu kullanmaktır . Bu, psql'nin çizelgeli biçiminden ziyade, seçiminizi ayrıştırması kolay bir biçimde dökülme avantajına sahiptir. Ayrıca kullanarak başka bir tablo / veritabanına almak çok kolaydır COPY FROM.

NB! Bu, süper kullanıcı ayrıcalıkları gerektirir ve sunucudaki bir dosyaya yazacaktır .

Misal: COPY (SELECT foo, bar FROM baz) TO '/tmp/query.csv' (format csv, delimiter ';')

';' İle bir CSV dosyası oluşturur alan ayırıcı olarak.

Her zaman olduğu gibi, ayrıntılar için belgelere bakın


Katılıyorum @helvete, burada sunulan yaklaşım, kullanıcının çıktıyı daha özelleştirici bir şekilde yapılandırması için daha fazla güç sağlıyor
— Nathan Benton

27

\copyhangi postgres komutu herhangi bir kullanıcı için çalışabilir. \ Dt için çalışıp çalışmadığını bilmiyorum, ancak genel sözdizimi aşağıdaki bağlantıdan yeniden üretilir Postgres SQL kopya sözdizimi

\copy (select * from tempTable limit 100) to 'filenameinquotes' with header delimiter as ','

Yukarıdakiler, csv dosyası olarak sağlanan dosya adına seçme sorgusunun çıktısını kaydeder

DÜZENLE:

Benim psql sunucusu için aşağıdaki komut çalışır bu eski bir sürüm v8.5

copy (select * from table1) to 'full_path_filename' csv header;

Çok kullanışlı, teşekkürler. Ancak '... kopyala ...' içindeki 'kopyala' gerekli değildir - aslında son sürümlerde komutun başarısız olmasına neden olur.
— Tom

Tom, bence bu bir yazım hatasıydı. Gönderiyi kurulumumda çalışan biriyle düzenledi pgsql 8.5ver
— Aakash Gupta

Sadece yaptığım gibi \ copy ve kafa karıştırıcı sözdizimi hataları aldıktan sonra çok satırlı bir ifadeye yapıştırmaya çalışan herkese hızlı bir not. \ Copy ile aynı satıra devam etmeniz gerekiyor.
— 18'de

\ Copy komutunu kapatmanın bir yolu var mı? Örneğinizde olduğu gibi bir deyim çalıştırırsam, örneğin, kullanıcılardan * seçtiğimde; sonuçları ekrana çıktı vermek yerine belirttiğim en son dosyaya ekleyeceğini unutmayın. Teşekkür ederim.
— raphael75

6

Pgsql komutunun o parametresini kullanın.

-o, --output = FILENAME sorgu sonuçlarını dosyaya (veya | pipe) gönder

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

3

COPY tablename TO '/tmp/output.csv' DELIMITER ',' CSV HEADER; bu komut tüm tabloyu csv olarak saklamak için kullanılır


Postgres KOPYA yerine db admin ihtiyacını önlemek için \ COPY ile değiştirilir. \ Tmp: pencereler bu koyar C dosya olarak
— Ocak

3

Aşağıdaki hatayı aldıysanız 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.

bu şekilde çalıştırabilirsiniz:

psql somepsqllink_or_credentials -c "COPY (SELECT foo, bar FROM baz) TO STDOUT (format csv, delimiter ';')" > baz.csv


2

Sonucu csv dosyasında saklamak için aşağıdaki sorguyu kullanın

\ copy (sorgunuz) 'dosya yolu' csv başlığına;

Misal

\ copy (satın alma_biriminden tarih_siparişi seçin) '/home/ankit/Desktop/result.csv' cvs başlığına;

Umarım bu yardımcı olur.


1

Bunun için bazı dahili psql komutu var olduğunu varsayıyorum, ancak ayrıca util-linux-ng paketinden scriptkomutu çalıştırabilirsiniz :

AÇIKLAMA Komut dosyası, terminalinizde yazdırılan her şeyin yazı tipini oluşturur.


0

Bu yaklaşım , orijinal komutta herhangi bir değişiklik veya ayarlama gerektirmeden en basitinden en karmaşık olana herhangi bir psql komutu ile çalışacaktır .

NOT: Linux sunucuları için.


  • Komutunuzun içeriğini bir dosyaya kaydedin

MODEL

read -r -d '' FILE_CONTENT << 'HEREDOC'
[COMMAND_CONTENT]

HEREDOC
echo -n "$FILE_CONTENT" > sqlcmd

MİSAL

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
  • Komutu çalıştır

MODEL

sudo -u postgres psql [some_db] -c "$(cat sqlcmd)" >>sqlop 2>&1

MİSAL

sudo -u postgres psql some_db -c "$(cat sqlcmd)" >>sqlop 2>&1

  • Komut çıktınızı görüntüleyin / izleyin

cat sqlop

Bitti! Teşekkürler! = D


0

Liman işçisi için yaklaşım

psql komutu ile

 docker exec -i %containerid% psql -U %user% -c '\dt' > tables.txt

veya sql dosyasındaki sorgu

docker exec -i %containerid% psql -U %user% < file.sql > data.txt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.