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.