psql - zapisz wyniki polecenia do pliku

283

Korzystam z psql, \dtaby wyświetlić listę wszystkich tabel w bazie danych i muszę zapisać wyniki.

Jaka jest składnia na eksport wyników polecenia psql do pliku?

pstanton
źródło
1
Zobacz także stackoverflow.com/questions/3939329/… .
Matt Solnit,

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
jhwist
źródło
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

intgr
źródło
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;
Aakash Gupta
źródło
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
Jawuz
źródło
3

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

Stephen
źródło
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

Daniil Mashkin
źródło
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.

Er.Ankit H Gandhi
źródło
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.

hlovdal
źródło
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.

Eduardo Lucio
źródło
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
Roman Rhrn Niestierow
źródło