psql - zapisz wyniki polecenia do pliku


Odpowiedzi:


478

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

1
mam zadzwonić przed \ dt, czy w kombinacji? dołącz składnię dzięki.
— pstanton

118
Pisanie \oponownie powoduje wyłączenie.
— Carl G

3
Niestety dane wyjściowe \?nie trafiają do pliku. :(
— blitzen9872,

za twoje uprzejme odmówienie uprawnień mówi, że spróbuj uruchomić psql jako administrator
— Ajay Takur

1
Tak, \o queries-output.txtprzekierowuje wszystkie kolejne polecenia o / p do pliku o nazwie queries-output.txti wpisanie \o( ponownie w wierszu polecenia psql ) odwraca to zachowanie przekierowania.
— hygull

95

Polecenie psql \ozostało już opisane przez jhwist.

Alternatywnym podejściem jest użycie COPY TOpolecenia 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


Zgadzam się @helvete, przedstawione tutaj podejście zapewnia użytkownikowi więcej mocy do konfigurowania danych wyjściowych w bardziej dostosowany sposób
— Nathan Benton

27

\copyktó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;

Bardzo przydatne, dzięki. Ale „kopiuj” w „... kopiuj do ...” nie jest wymagane - w rzeczywistości w najnowszych wersjach powoduje to niepowodzenie polecenia.
— Tom

Tom, myślę, że to była literówka. Edytowałem post za pomocą tego, który działa na mojej instalacji pgsql 8.5ver
— Aakash Gupta

Tylko krótka notatka dla każdego, kto próbuje wkleić instrukcję do wielu wierszy po \ kopiowaniu i dostaje mylące błędy składniowe, tak jak właśnie to zrobiłem. Musisz kontynuować w tej samej linii co \ copy.
— zadał

Czy istnieje sposób na wyłączenie \ kopiowania? Odkryłem, że jeśli uruchomię instrukcję jak w twoim przykładzie, a następnie uruchomię, na przykład, wybierz * z użytkowników; dołącza wyniki do najnowszego pliku, który podałem, zamiast wyświetlać na ekranie. Dziękuję Ci.
— raphael75

6

Użyj parametru o polecenia pgsql.

-o, --output = NAZWA PLIKU wyślij wyniki zapytania do pliku (lub | potoku)

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

3

COPY tablename TO '/tmp/output.csv' DELIMITER ',' CSV HEADER; to polecenie służy do przechowywania całej tabeli jako csv


W postgresie COPY lepiej jest zastąpić \ COPY, aby uniknąć potrzeby db admin. W oknach Stawia to plik C: \ tmp
— Jan

3

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


2

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.


1

Zakładam, że istnieje do tego wewnętrzna komenda psql, ale możesz również uruchomić scriptkomendę z pakietu util-linux-ng :

OPIS Skrypt tworzy maszynopis wszystkiego wydrukowanego na twoim terminalu.


0

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.


  • Zapisz zawartość polecenia w pliku

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
  • Uruchom polecenie

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

  • Wyświetl / śledź dane wyjściowe polecenia

cat sqlop

Gotowe! Dzięki! = D.


0

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.