Gibt es eine Möglichkeit, Postgres-Tabellendaten als JSON in eine Datei zu exportieren? Ich brauche die Ausgabe Zeile für Zeile, wie:
{'id':1,'name':'David'}
{'id':2,'name':'James'}
...
BEARBEITEN: postgres version: 9.3.4
quelle
Gibt es eine Möglichkeit, Postgres-Tabellendaten als JSON in eine Datei zu exportieren? Ich brauche die Ausgabe Zeile für Zeile, wie:
{'id':1,'name':'David'}
{'id':2,'name':'James'}
...
BEARBEITEN: postgres version: 9.3.4
Versuchen Sie hier ein grundlegendes Intro zu PostgreSQL
und JSON
.
Außerdem ist die PostgreSQL-Dokumentation ziemlich gut. Probieren Sie sie hier aus . Überprüfen Sie die pretty_bool
Option.
Ihre ursprüngliche Frage lautete "Gibt es eine Möglichkeit, Postgres-Tabellendaten zu exportieren als JSON
". Sie wollten es in diesem Format
{'id':1,'name':'David'}
{'id':2,'name':'James'}
...
Ich hatte keine laufende Instanz von, PostgreSQL
also habe ich 9.4 heruntergeladen, kompiliert und installiert.
Um das zu beantworten, habe ich zuerst CREATE
einen Tisch bearbeitet (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');
Dann, um zu überprüfen:
test=# select * from fred;
mary | jimmy | paulie
------+-------+------------------
2 | 43 | asfasfasfd
3 | 435 | ererere
6 | 43343 | eresdfssfsfasfae
Dann habe ich diesen Befehl gegeben
test=# COPY (SELECT ROW_TO_JSON(t)
test(# FROM (SELECT * FROM fred) t)
test-# TO '/paulstuff/sware/db/postgres/inst/myfile';
COPY 3
test=#
Ich habe dann psql beendet und die Datei myfile aufgelistet.
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]$
(Sie können mit der Ausgabe von experimentieren
COPY (SELECT ROW_TO_JSON(t, TRUE) -- <-- Note addition of "TRUE" here!
in Ihrer Freizeit).
@ Offby1 hat darauf hingewiesen, dass die Ausgabe (obwohl sie der Frage des OP entspricht) nicht korrekt ist JSON
. @EvanCarroll wies darauf hin, dass dies \o
auch eine Möglichkeit zur Ausgabe in eine Datei ist. Daher habe ich die Lösungen für diese beiden Probleme in dieser Anweisung kombiniert (mit Hilfe von hier ):
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
gibt:
[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]$
ENDLICH gibt es das Backslash ( \
) - Problem, auf das @AdamGent in seinem Beitrag anspielt. Dies war ein bisschen schwierig, aber es ist möglich, ohne auf die Verarbeitung nach der Abfrage zurückzugreifen. Voilà:
INSERT INTO fred VALUES (35, 5, 'wrew\sdfsd');
INSERT INTO fred VALUES (3, 44545, '\sdfs\\\sfs\\gf');
Und mit REGEXP_REPLACE (beachte den cast :: TEXT) werden die überschüssigen Blackslashes entfernt.
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
gibt:
[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 Was den Kommentar von @ Zoltán angeht - das könnte eine Versionssache sein - nicht reproduzierbar!).
backslash
in Ihren Spalten haben !!!! Lesen Sie das COPY-Dokument sorgfältig durch, da es spezielle Aufgaben fürbackslash
Zeichen ausführt (z. B. das Hinzufügen eines weiteren Backslash).Wenn Sie verwenden,
psql
gibt es keinen Grund,\COPY
überhaupt zu verwenden.Dies ist die gleiche Methode, die wir verwenden, um png / jpgs / tifs mit PostGIS aus der Datenbank zu holen, um sie schnell zu testen und um Skriptdateien mit PostgreSQL-Erweiterungen zu generieren.
quelle
psql
ist -native-Befehle der einfachste Weg , in relativen Pfad zu kopieren ! PS: Es gibt eine "Terminal-Methode", um einen echten COPY-Befehl mit einem relativen Pfad zu verwenden (siehe hier) .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
Für mich @ verace Antwort hat die Spaltennamen nicht beibehalten, sondern zugewiesen Standardnamen (
f1
,f2
usw.) statt. Ich verwende PostgreSQL 9.1 mit der JSON-Erweiterung .Wenn Sie die gesamte Tabelle exportieren möchten, ist keine Unterabfrage erforderlich. Darüber hinaus werden die Spaltennamen beibehalten. Ich habe die folgende Abfrage verwendet:
quelle
CREATE TABLE fred (mary INT, jimmy INT, paulie VARCHAR(20));
und das Ergebnis:{"mary":2,"jimmy":43,"paulie":"asfasfasfd"}
- Feldnamen sind mary, jimmy, paulie ... und NICHT (f1
,f2
., etc) ...Ich werde Veraces Antwort eine besondere Einschränkung hinzufügen . Sie müssen Nachverarbeitung auf der ausgegebenen JSON - Datei tun , wenn Sie Textspalten mit Backslash Zeichen:
\
.Andernfalls erhalten Sie bestenfalls ein Duplikat (
\
->\\
) und im schlimmsten Fall ein vollständig ungültiges JSON.Dies:
Wird
Was gut aussieht, aber völlig ungültiges JSON ist.
Sie können das
\\
in\
durch sed ersetzen :Von Postgres COPY, wo sie es erwähnen:
quelle
Eine allgemeine (MySQL, Postgres, SQLite ..) und kostenlose Lösung, für die Sie keine Software installieren müssen (außer Docker), finden Sie unter https://github.com/function61/sql2json
Vollständige Offenlegung: Ich habe diese Software geschrieben.
quelle
Dies ist die einzige Methode, die gültiges JSON (Array of Objects) ausgibt .
( Quelle )
quelle