Yanıtlar:
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
\o
Tekrar yazmak onu kapatır.
\?
dosyaya gitmez. :(
\o queries-output.txt
sonraki tüm o / p komutlarını adlı dosyaya yönlendirir queries-output.txt
ve yazarak \o
( tekrar psql isteminde) bu yönlendirme davranışını geri alır.
Psql'in \o
komut zaten jhwist tarafından tarif edilmiştir.
Alternatif bir yaklaşım, COPY TO
doğ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
\copy
hangi 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;
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
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.
Bunun için bazı dahili psql komutu var olduğunu varsayıyorum, ancak ayrıca util-linux-ng paketinden script
komutu çalıştırabilirsiniz :
AÇIKLAMA Komut dosyası, terminalinizde yazdırılan her şeyin yazı tipini oluşturur.
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.
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
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
cat sqlop
Bitti! Teşekkürler! = D
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