Czy istnieje sposób na eksport danych tabeli Postgres jako pliku Json do pliku? Potrzebuję, aby wynik był wiersz po wierszu, na przykład:
{'id':1,'name':'David'}
{'id':2,'name':'James'}
...
EDYCJA: wersja postgres: 9.3.4
źródło
Czy istnieje sposób na eksport danych tabeli Postgres jako pliku Json do pliku? Potrzebuję, aby wynik był wiersz po wierszu, na przykład:
{'id':1,'name':'David'}
{'id':2,'name':'James'}
...
EDYCJA: wersja postgres: 9.3.4
Wypróbuj tutaj, aby uzyskać podstawowe wprowadzenie do PostgreSQL
i JSON
.
Ponadto dokumentacja PostgreSQL jest całkiem dobra, więc spróbuj tutaj . Sprawdź pretty_bool
opcję.
Twoje pierwotne pytanie brzmiało: „Czy istnieje sposób na eksport danych tabeli postgres jako JSON
”. Chciałeś go w tym formacie
{'id':1,'name':'David'}
{'id':2,'name':'James'}
...
Nie miałem uruchomionej instancji, PostgreSQL
więc pobrałem, skompilowałem i zainstalowałem 9.4.
Aby odpowiedzieć na to pytanie, najpierw CREATE
edytowałem tabelę (Fred)
CREATE TABLE fred (mary INT, jimmy INT, paulie VARCHAR(20));
INSERT INTO fred VALUES (2, 43, 'asfasfasfd' );
INSERT INTO fred VALUES (3, 435, 'ererere' );
INSERT INTO fred VALUES (6, 43343, 'eresdfssfsfasfae');
Następnie, aby sprawdzić:
test=# select * from fred;
mary | jimmy | paulie
------+-------+------------------
2 | 43 | asfasfasfd
3 | 435 | ererere
6 | 43343 | eresdfssfsfasfae
Potem wydałem to polecenie
test=# COPY (SELECT ROW_TO_JSON(t)
test(# FROM (SELECT * FROM fred) t)
test-# TO '/paulstuff/sware/db/postgres/inst/myfile';
COPY 3
test=#
Następnie zamknąłem psql i wymieniłem plik mój_plik.
test=# \q
[pol@polhost inst]$ more myfile
{"mary":2,"jimmy":43,"paulie":"asfasfasfd"}
{"mary":3,"jimmy":435,"paulie":"ererere"}
{"mary":6,"jimmy":43343,"paulie":"eresdfssfsfasfae"}
[pol@polhost inst]$
(możesz eksperymentować z danymi wyjściowymi z
COPY (SELECT ROW_TO_JSON(t, TRUE) -- <-- Note addition of "TRUE" here!
w wolnym czasie).
@ Offby1 wskazało, że dane wyjściowe (odpowiadające pytaniu PO) są nieprawidłowe JSON
. @EvanCarroll zwrócił uwagę, że \o
jest to również sposób na wyjście do pliku, dlatego w tym zestawieniu połączyłem rozwiązania dla tych dwóch czarnuchów (z pomocą tutaj ):
test=# \o out.json
test=# SELECT array_to_json(array_agg(fred), FALSE) AS ok_json FROM fred;
-- <-- "TRUE" here will produce plus
("+) signs in the output. "FALSE"
is the default anyway.
test=# \o
daje:
[pol@polhost inst]$ more out.json
ok_json
----------------------------------------------------------------------------------------------------------------------------------------------
[{"mary":2,"jimmy":43,"paulie":"asfasfasfd"},{"mary":3,"jimmy":435,"paulie":"ererere"},{"mary":6,"jimmy":43343,"paulie":"eresdfssfsfasfae"}]
(1 row)
[pol@polhost inst]$
WRESZCIE istnieje \
problem odwrotnego ukośnika ( ), o którym wspomniał @AdamGent w swoim poście. To było trochę trudne, ale jest to możliwe bez uciekania się do przetwarzania po zapytaniu. Voilà:
INSERT INTO fred VALUES (35, 5, 'wrew\sdfsd');
INSERT INTO fred VALUES (3, 44545, '\sdfs\\\sfs\\gf');
A użycie REGEXP_REPLACE w ten sposób (zwróć uwagę na obsadę :: TEKST) usuwa nadmiar czarnych plam.
test=# \o slash.json
test=# SELECT REGEXP_REPLACE(ROW_TO_JSON(t)::TEXT, '\\\\', '\\', 'g')
test=# FROM (SELECT * FROM fred) AS t; -- I found that using a CTE was helpful for legibility
test=# \o
test=# \q
daje:
[pol@polhost inst]$ more slash.json
regexp_replace
------------------------------------------------------
{"mary":2,"jimmy":43,"paulie":"asfasfasfd"}
{"mary":3,"jimmy":435,"paulie":"ererere"}
{"mary":6,"jimmy":43343,"paulie":"eresdfssfsfasfae"}
{"mary":35,"jimmy":5,"paulie":"wrew\sdfsd"}
{"mary":3,"jimmy":44545,"paulie":"\sdfs\\\sfs\\gf"}
(5 rows)
[pol@polhost inst]$
(ps Jeśli chodzi o komentarz @ Zoltána - może to być wersja - nie można go odtworzyć!).
backslash
w swoich kolumnach !!!! Przeczytaj uważnie dokument KOPIUJ, ponieważ robi on specjalne rzeczy dlabackslash
postaci (np. Dodaje kolejny odwrotny ukośnik).Jeśli używasz,
psql
nie ma żadnego powodu, aby z niego korzystać\COPY
.Jest to ta sama metoda, której używamy do pobierania png / jpgs / tifs z bazy danych za pomocą PostGIS do szybkich testów, a także do generowania plików skryptów z rozszerzeniami PostgreSQL.
źródło
psql
-native to najprostszy sposób na skopiowanie do ścieżki względnej ! PS: istnieje „terminalowy sposób” użycia prawdziwego polecenia COPY ze względną ścieżką, patrz tutaj .psql -h remotehost -d remote_mydb -U myuser -c "COPY (SELECT '{\"x\":1,\"y\":[\"a\",2]}'::json AS r) TO STDOUT" > ./relative_path/file.csv
Dla mnie odpowiedź @ Verace za nie utrzymać nazwy kolumn, ale przypisane domyślne nazwy (
f1
,f2
, itd.) Zamiast. Używam PostgreSQL 9.1 z rozszerzeniem JSON .Jeśli chcesz wyeksportować całą tabelę, nie ma potrzeby podkwerendy. Ponadto zachowa nazwy kolumn. Użyłem następującego zapytania:
źródło
CREATE TABLE fred (mary INT, jimmy INT, paulie VARCHAR(20));
i wynik:{"mary":2,"jimmy":43,"paulie":"asfasfasfd"}
- nazwy pól są mary, Jimmy, Paulie ... i NIE (f1
,f2
., etc) ...Dodam specjalne zastrzeżenie do odpowiedzi Verace'a . Trzeba zrobić pocztowy przetwarzanie na wysyłanego pliku JSON, jeśli masz kolumny tekstu ze znakami backslash:
\
.W przeciwnym razie otrzymasz duplikat (
\
->\\
) w najlepszym wypadku i całkowicie niepoprawny JSON w gorszym stanie, tj .:To:
Staje się
Co wygląda dobrze, ale jest całkowicie niepoprawny JSON.
Możesz zamienić na
\\
na\
sed:Z Postgres COPY, w którym mówią o tym:
źródło
Aby uzyskać ogólne (MySQL, Postgres, SQLite ..) i bezpłatne rozwiązanie, dla którego nie musisz instalować żadnego oprogramowania (oprócz Docker), zobacz https://github.com/function61/sql2json
Pełne ujawnienie: napisałem to oprogramowanie.
źródło
Jest to jedyna metoda, która wyprowadza prawidłowy JSON (tablica obiektów).
( źródło )
źródło