Jaki jest najłatwiejszy sposób zapisania danych wyjściowych PL / pgSQL z bazy danych PostgreSQL w pliku CSV?
Używam PostgreSQL 8.4 z wtyczką pgAdmin III i PSQL, z której uruchamiam zapytania.
Jaki jest najłatwiejszy sposób zapisania danych wyjściowych PL / pgSQL z bazy danych PostgreSQL w pliku CSV?
Używam PostgreSQL 8.4 z wtyczką pgAdmin III i PSQL, z której uruchamiam zapytania.
Odpowiedzi:
Czy chcesz wynikowy plik na serwerze, czy na kliencie?
Po stronie serwera
Jeśli chcesz czegoś łatwego do ponownego użycia lub zautomatyzowania, możesz użyć wbudowanego polecenia Postgresql COPY . na przykład
To podejście działa całkowicie na zdalnym serwerze - nie można zapisywać na lokalnym komputerze. Musi także działać jako „superużytkownik” Postgresa (zwykle nazywany „rootem”), ponieważ Postgres nie może przestać robić nieprzyjemnych rzeczy z lokalnym systemem plików tego komputera.
To tak naprawdę nie oznacza, że musisz być podłączony jako superużytkownik (automatyzacja byłaby rodzajem ryzyka bezpieczeństwa innego rodzaju), ponieważ możesz użyć tej
SECURITY DEFINER
opcji,CREATE FUNCTION
aby stworzyć funkcję działającą tak, jakbyś był superużytkownikiem .Najważniejsze jest to, że twoja funkcja wykonuje dodatkowe kontrole, nie tylko omijając zabezpieczenia - więc możesz napisać funkcję, która eksportuje dokładnie potrzebne dane, lub możesz napisać coś, co zaakceptuje różne opcje, o ile tylko poznać ścisłą białą listę. Musisz sprawdzić dwie rzeczy:
GRANT
s w bazie danych, ale funkcja działa teraz jako superużytkownik, więc tabele, które normalnie byłyby poza zakresem, będą w pełni dostępne. Prawdopodobnie nie chcesz, aby ktoś wywoływał twoją funkcję i dodawał wiersze na końcu tabeli „użytkowników”…Napisałem post na blogu, w którym omawiam to podejście , w tym kilka przykładów funkcji eksportujących (lub importujących) pliki i tabele spełniające surowe warunki.
Strona klienta
Drugim podejściem jest obsługa plików po stronie klienta , tj. W aplikacji lub skrypcie. Serwer Postgres nie musi wiedzieć, do którego pliku kopiujesz, po prostu wyrzuca dane, a klient gdzieś je umieszcza.
Podstawową składnią tego
COPY TO STDOUT
polecenia jest polecenie, a narzędzia graficzne, takie jak pgAdmin, zawiną go w miłym oknie dialogowym.psql
Klient wiersza polecenia ma specjalny „meta-polecenia” o nazwie\copy
, która przyjmuje wszystkie te same opcje jak „prawdziwe”COPY
, ale jest prowadzony wewnątrz klienta:Zauważ, że nie ma zakończenia
;
, ponieważ meta-polecenia są kończone znakiem nowej linii, w przeciwieństwie do poleceń SQL.Z dokumentów :
Język programowania aplikacji może również obsługiwać wypychanie lub pobieranie danych, ale ogólnie nie można używać
COPY FROM STDIN
/TO STDOUT
w standardowej instrukcji SQL, ponieważ nie ma możliwości podłączenia strumienia wejściowego / wyjściowego. Wózek PostgreSQL PHP ( nie PDO) zawiera bardzo podstawowepg_copy_from
ipg_copy_to
funkcje, które kopiują do / z tablicy PHP, który nie może być skuteczny w przypadku dużych zbiorów danych.źródło
\copy
też też działa - tam ścieżki są względne w stosunku do klienta i nie jest potrzebny / dozwolony żaden średnik. Zobacz moją edycję.\copy
musi być jednowarstwowy. Więc nie dostaniesz piękna formatowania sql tak, jak chcesz, i po prostu umieszczenia wokół niego kopii / funkcji.\copy
jest specjalnym meta-poleceniem wpsql
kliencie wiersza poleceń . Nie będzie działać na innych klientach, takich jak pgAdmin; zapewne będą mieli własne narzędzia, takie jak graficzni kreatorzy, do wykonywania tej pracy.Istnieje kilka rozwiązań:
1
psql
poleceniepsql -d dbname -t -A -F"," -c "select * from users" > output.csv
Ma to tę wielką zaletę, że można go używać za pośrednictwem SSH, na przykład
ssh postgres@host command
- umożliwiając uzyskanie2
copy
polecenia postgresCOPY (SELECT * from users) To '/tmp/output.csv' With CSV;
3 psql interaktywne (lub nie)
Wszystkie z nich mogą być używane w skryptach, ale wolę numer 1.
4 pgadmin, ale nie jest to możliwe do skryptu.
źródło
W terminalu (po podłączeniu do bazy danych) ustaw dane wyjściowe w pliku cvs
1) Ustaw separator pola na
','
:2) Ustaw format wyjściowy bez wyrównania:
3) Pokaż tylko krotki:
4) Ustaw moc wyjściową:
5) Wykonaj zapytanie:
6) Wyjście:
Będziesz wtedy mógł znaleźć swój plik csv w tej lokalizacji:
Skopiuj go za pomocą
scp
polecenia lub edytuj za pomocą nano:źródło
COPY
Lub\copy
zbliża uchwyt poprawnie (konwersja do standardowego formatu CSV); robi to?Jeśli interesują Cię wszystkie kolumny określonej tabeli wraz z nagłówkami, możesz użyć
To jest trochę prostsze niż
które, zgodnie z moją najlepszą wiedzą, są równoważne.
źródło
Ujednolicenie eksportu CSV
Ta informacja nie jest właściwie dobrze reprezentowana. Ponieważ po raz drugi muszę to wyciągnąć, umieszczę to tutaj, aby przypomnieć sobie, czy nic więcej.
Naprawdę najlepszym sposobem na to (pobranie CSV z postgres) jest użycie
COPY ... TO STDOUT
polecenia. Chociaż nie chcesz tego robić w sposób pokazany w odpowiedziach tutaj. Prawidłowy sposób użycia polecenia to:Zapamiętaj tylko jedno polecenie!
Jest świetny do użycia przez ssh:
Jest świetny do użycia wewnątrz dokera nad ssh:
Jest nawet świetny na lokalnej maszynie:
Lub wewnątrz dokera na komputerze lokalnym ?:
Lub w klastrze kubernetes, w oknie dokowanym, przez HTTPS?
Tak wszechstronny, dużo przecinków!
Czy ty w ogóle?
Tak, zrobiłem, oto moje notatki:
KOPIE
Używanie
/copy
skutecznie wykonuje operacje na plikach w dowolnym systemie, na którympsql
uruchomiona jest komenda, tak jak użytkownik, który ją wykonuje 1 . Jeśli łączysz się ze zdalnym serwerem, łatwo jest skopiować pliki danych w systemie wykonującym siępsql
do / ze zdalnego serwera.COPY
wykonuje operacje na plikach na serwerze jako konto użytkownika procesu zaplecza (domyślniepostgres
), ścieżki plików i uprawnienia są sprawdzane i odpowiednio stosowane. Jeśli używasz,TO STDOUT
wówczas sprawdzanie uprawnień do plików jest pomijane.Obie te opcje wymagają kolejnego przenoszenia pliku, jeśli
psql
nie jest wykonywany w systemie, w którym docelowy CSV ma się ostatecznie znajdować. Z mojego doświadczenia wynika, że jest to najbardziej prawdopodobny przypadek, gdy pracujesz głównie ze zdalnymi serwerami.Bardziej skomplikowane jest skonfigurowanie czegoś takiego jak tunel TCP / IP przez ssh do zdalnego systemu w celu uzyskania prostego wyjścia CSV, ale w przypadku innych formatów wyjściowych (binarnych) lepiej może być
/copy
w przypadku połączenia tunelowanego, wykonując lokalniepsql
. Podobnie w przypadku dużych importów przenoszenie pliku źródłowego na serwer i używanieCOPY
jest prawdopodobnie opcją o najwyższej wydajności.Parametry PSQL
Za pomocą parametrów psql możesz sformatować dane wyjściowe, takie jak CSV, ale są też wady, takie jak konieczność pamiętania o wyłączeniu pagera i braku pobierania nagłówków:
Inne narzędzia
Nie, chcę tylko usunąć CSV z mojego serwera bez kompilacji i / lub instalacji narzędzia.
źródło
Musiałem użyć \ COPY, ponieważ otrzymałem komunikat o błędzie:
Więc użyłem:
i to działa
źródło
psql
mogę to dla ciebie zrobić:Aby
man psql
uzyskać pomoc na temat opcji tutaj użytych.źródło
Pracuję nad AWS Redshift, który nie obsługuje tej
COPY TO
funkcji.Moje narzędzie BI obsługuje jednak pliki CSV rozdzielane tabulatorami, więc użyłem następujących opcji:
źródło
Nowa wersja - psql 12 - będzie obsługiwać
--csv
.Stosowanie:
źródło
W pgAdmin III istnieje opcja eksportu do pliku z okna zapytania. W menu głównym jest to Zapytanie -> Wykonaj do pliku lub przycisk, który robi to samo (jest to zielony trójkąt z niebieską dyskietką w przeciwieństwie do zwykłego zielonego trójkąta, który po prostu uruchamia zapytanie). Jeśli nie uruchamiasz zapytania z okna zapytania, zrobiłbym to, co sugerował IMSoP, i użyłem polecenia kopiowania.
źródło
Próbowałem kilku rzeczy, ale niewiele z nich dało mi pożądany plik CSV ze szczegółami nagłówka.
Oto, co zadziałało dla mnie.
źródło
Napisałem małe narzędzie o nazwie,
psql2csv
które zamykaCOPY query TO STDOUT
wzorzec, co skutkuje poprawnym CSV. Jego interfejs jest podobny dopsql
.Przyjmuje się, że zapytanie jest zawartością STDIN, jeśli jest obecny, lub ostatnim argumentem. Wszystkie inne argumenty są przekazywane do psql, z wyjątkiem tych:
źródło
Jeśli masz dłuższe zapytanie i chcesz użyć psql, umieść zapytanie w pliku i użyj następującego polecenia:
źródło
-F","
zamiast-F";"
wygenerować plik CSV, który otworzyłby się poprawnie w MS ExcelAby pobrać plik CSV z nazwami kolumn jako HEADER, użyj tego polecenia:
źródło
Gorąco polecam DataGrip , bazę danych IDE firmy JetBrains. Możesz wyeksportować zapytanie SQL do pliku CSV i łatwo skonfigurować tunelowanie ssh. Kiedy dokumentacja odnosi się do „zestawu wyników”, oznaczają one wynik zwracany przez zapytanie SQL w konsoli.
Nie jestem związany z DataGrip, po prostu uwielbiam ten produkt!
źródło
JackDB , klient bazy danych w przeglądarce internetowej, sprawia, że jest to naprawdę łatwe. Zwłaszcza jeśli jesteś na Heroku.
Pozwala łączyć się ze zdalnymi bazami danych i uruchamiać na nich zapytania SQL.
Źródło (źródło: jackdb.com )
Po podłączeniu bazy danych możesz uruchomić zapytanie i wyeksportować do pliku CSV lub TXT (patrz dolny prawy róg).
Uwaga: Nie jestem w żaden sposób związany z JackDB. Obecnie korzystam z ich bezpłatnych usług i uważam, że to świetny produkt.
źródło
Na prośbę @ skeller88 ponownie zamieszczam mój komentarz jako odpowiedź, aby nie gubił się u osób, które nie czytają każdej odpowiedzi ...
Problem z DataGrip polega na tym, że chwyta on twój portfel. To nie jest za darmo. Wypróbuj wersję społecznościową DBeaver ze strony dbeaver.io. To wieloplatformowe narzędzie FOSS dla programistów SQL, DBA i analityków, które obsługuje wszystkie popularne bazy danych: MySQL, PostgreSQL, SQLite, Oracle, DB2, SQL Server, Sybase, MS Access, Teradata, Firebird, Hive, Presto itp.
DBeaver Community Edition sprawia, że łączenie się z bazą danych jest proste, zadawanie zapytań w celu pobrania danych, a następnie pobieranie zestawu wyników w celu zapisania go w CSV, JSON, SQL lub innych popularnych formatach danych. Jest realnym konkurentem FOSS dla TOAD dla Postgres, TOAD dla SQL Server lub Toad dla Oracle.
Nie mam powiązań z DBeaver. Uwielbiam cenę i funkcjonalność, ale chciałbym, żeby bardziej otworzyły aplikację DBeaver / Eclipse i ułatwiły dodawanie widżetów analitycznych do DBeaver / Eclipse, zamiast wymagać od użytkowników płacenia za roczną subskrypcję do tworzenia wykresów i wykresów bezpośrednio w obrębie Aplikacja. Moje umiejętności kodowania Java są zardzewiałe i nie mam ochoty poświęcić tygodni na ponowne nauczenie się, jak budować widżety Eclipse, ale okazało się, że DBeaver wyłączył możliwość dodawania widgetów innych firm do DBeaver Community Edition.
Czy użytkownicy DBeaver mają wgląd w etapy tworzenia widgetów analitycznych, które można dodać do Community Edition DBeaver?
źródło
źródło