Odpowiedzi:
Z pomocy psql ( \?
):
\ o [PLIK] wyślij wszystkie wyniki zapytania do pliku lub | potoku
Sekwencja poleceń będzie wyglądać następująco:
[wist@scifres ~]$ psql db
Welcome to psql 8.3.6, the PostgreSQL interactive terminal
db=>\o out.txt
db=>\dt
db=>\q
\o
ponownie powoduje wyłączenie.
\?
nie trafiają do pliku. :(
\o queries-output.txt
przekierowuje wszystkie kolejne polecenia o / p do pliku o nazwie queries-output.txt
i wpisanie \o
( ponownie w wierszu polecenia psql ) odwraca to zachowanie przekierowania.
Polecenie psql \o
zostało już opisane przez jhwist.
Alternatywnym podejściem jest użycie COPY TO
polecenia do zapisu bezpośrednio do pliku na serwerze. Ma to tę zaletę, że jest zrzucane w wybranym, łatwym do przeanalizowania formacie - zamiast formatu tabelarycznego psql. Bardzo łatwo jest również zaimportować do innej tabeli / bazy danych COPY FROM
.
NB! Wymaga to uprawnień administratora i zapisuje do pliku na serwerze .
Przykład: COPY (SELECT foo, bar FROM baz) TO '/tmp/query.csv' (format csv, delimiter ';')
Tworzy plik CSV za pomocą „;” jako separator pól.
Jak zawsze zobacz szczegóły w dokumentacji
\copy
który jest poleceniem postgres, może działać dla każdego użytkownika. Nie wiem, czy to działa dla \ dt, czy nie, ale ogólna składnia została odtworzona z następującego linku Składnia kopii SQL Postgres
\copy (select * from tempTable limit 100) to 'filenameinquotes' with header delimiter as ','
Powyższe spowoduje zapisanie wyniku wybranego zapytania w nazwie pliku podanej jako plik csv
EDYTOWAĆ:
Dla mojego serwera psql działa następująca komenda, to jest starsza wersja 8.5
copy (select * from table1) to 'full_path_filename' csv header;
Jeśli wystąpił następujący błąd
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.
możesz uruchomić go w ten sposób:
psql somepsqllink_or_credentials -c "COPY (SELECT foo, bar FROM baz) TO STDOUT (format csv, delimiter ';')" > baz.csv
Użyj poniższego zapytania, aby zapisać wynik w pliku csv
\ skopiuj (zapytanie) do nagłówka csv „ścieżka pliku”;
Przykład
\ copy (wybierz nazwę, data z zamówienia z zamówienia) do nagłówka cvs „/home/ankit/Desktop/result.csv”;
Mam nadzieję, że ci to pomoże.
Zakładam, że istnieje do tego wewnętrzna komenda psql, ale możesz również uruchomić script
komendę z pakietu util-linux-ng :
OPIS Skrypt tworzy maszynopis wszystkiego wydrukowanego na twoim terminalu.
To podejście będzie działać z dowolną komendą psql, od najprostszej do najbardziej złożonej, bez konieczności wprowadzania zmian lub poprawek w pierwotnej komendzie.
UWAGA: Dla serwerów Linux.
MODEL
read -r -d '' FILE_CONTENT << 'HEREDOC'
[COMMAND_CONTENT]
HEREDOC
echo -n "$FILE_CONTENT" > sqlcmd
PRZYKŁAD
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
PRZYKŁAD
sudo -u postgres psql some_db -c "$(cat sqlcmd)" >>sqlop 2>&1
cat sqlop
Gotowe! Dzięki! = D.
Podejście do dokera
za pomocą komendy psql
docker exec -i %containerid% psql -U %user% -c '\dt' > tables.txt
lub zapytanie z pliku sql
docker exec -i %containerid% psql -U %user% < file.sql > data.txt