Apakah ada cara untuk mengekspor data tabel postgres sebagai json ke file? Saya perlu output menjadi baris demi baris, seperti:
{'id':1,'name':'David'}
{'id':2,'name':'James'}
...
EDIT: versi postgres: 9.3.4
sumber
Apakah ada cara untuk mengekspor data tabel postgres sebagai json ke file? Saya perlu output menjadi baris demi baris, seperti:
{'id':1,'name':'David'}
{'id':2,'name':'James'}
...
EDIT: versi postgres: 9.3.4
Coba di sini untuk pengantar dasar ke PostgreSQL
dan JSON
.
Juga, dokumentasi PostgreSQL cukup bagus, jadi coba di sini . Lihat pretty_bool
opsi.
Pertanyaan awal Anda adalah "Apakah ada cara untuk mengekspor data tabel postgres sebagai JSON
". Anda menginginkannya dalam format ini
{'id':1,'name':'David'}
{'id':2,'name':'James'}
...
Saya tidak memiliki instance yang sedang berjalan PostgreSQL
sehingga saya mengunduh, mengkompilasi dan menginstal 9.4.
Untuk menjawab ini, saya pertama-tama CREATE
mengedit 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');
Kemudian, untuk memeriksa:
test=# select * from fred;
mary | jimmy | paulie
------+-------+------------------
2 | 43 | asfasfasfd
3 | 435 | ererere
6 | 43343 | eresdfssfsfasfae
Lalu saya mengeluarkan perintah ini
test=# COPY (SELECT ROW_TO_JSON(t)
test(# FROM (SELECT * FROM fred) t)
test-# TO '/paulstuff/sware/db/postgres/inst/myfile';
COPY 3
test=#
Saya kemudian berhenti psql dan daftar file myfile.
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]$
(Anda dapat bereksperimen dengan output dari
COPY (SELECT ROW_TO_JSON(t, TRUE) -- <-- Note addition of "TRUE" here!
di waktu luang Anda).
Itu ditunjukkan oleh @ offby1 bahwa output (sementara sesuai dengan pertanyaan OP) tidak benar JSON
. @EvanCarroll menunjukkan bahwa \o
ini juga merupakan cara untuk menghasilkan file, jadi saya menggabungkan solusi untuk dua niggle ini dalam pernyataan ini (dengan bantuan dari sini ):
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
memberi:
[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]$
AKHIRNYA , ada masalah backslash ( \
) yang disinggung oleh @AdamGent dalam posnya. Ini adalah sedikit rumit, tetapi adalah mungkin tanpa menggunakan pengolahan pasca-query. Voa:
INSERT INTO fred VALUES (35, 5, 'wrew\sdfsd');
INSERT INTO fred VALUES (3, 44545, '\sdfs\\\sfs\\gf');
Dan dengan menggunakan REGEXP_REPLACE demikian (perhatikan gips :: TEXT) menghapus kelebihan blackslash.
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
memberi:
[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 As untuk komentar Zoltán - ini mungkin versi versi - tidak dapat direproduksi!).
backslash
di kolom Anda !!!! Baca dengan seksama dokumen COPY karena ia melakukan hal-hal khusus untukbackslash
karakter (seperti menambahkan backslash lain).Jika Anda menggunakan
psql
maka tidak ada alasan untuk menggunakannya\COPY
sama sekali.Ini adalah metode yang sama yang kita gunakan untuk mengeluarkan png / jpgs / tif dari database dengan PostGIS untuk pengujian cepat, dan juga untuk menghasilkan file skrip dengan ekstensi PostgreSQL.
sumber
psql
-natif-perintah adalah cara termudah untuk menyalin ke jalur relatif ! PS: ada "cara terminal" untuk menggunakan perintah COPY nyata dengan jalur relatif, lihat di sini .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
Bagi saya @ jawaban Verace ini tidak menjaga nama kolom, namun nama-nama standar yang ditetapkan (
f1
,f2
, dll) sebagai gantinya. Saya menggunakan PostgreSQL 9.1 dengan ekstensi JSON .Jika Anda ingin mengekspor seluruh tabel, tidak perlu subquery. Selain itu, ini akan mempertahankan nama kolom. Saya menggunakan permintaan berikut:
sumber
CREATE TABLE fred (mary INT, jimmy INT, paulie VARCHAR(20));
dan hasil:{"mary":2,"jimmy":43,"paulie":"asfasfasfd"}
- nama field yang mary, jimmy, Paulie ... dan TIDAK (f1
,f2
., dll) ...Saya akan menambahkan peringatan khusus untuk jawaban Verace . Anda perlu melakukan pengolahan pasca pada file JSON yang dikeluarkan jika Anda memiliki kolom teks dengan karakter backslash:
\
.Kalau tidak, Anda akan mendapatkan duplikat (
\
->\\
) di JSON terbaik dan benar-benar tidak valid di lebih buruk yaitu:Ini:
Menjadi
Yang terlihat baik-baik saja tetapi JSON benar-benar tidak valid.
Anda dapat mengganti
\\
ke\
dengan sed:Dari Postgres COPY di mana mereka sekitar menyebutkannya:
sumber
Untuk solusi generik (MySQL, Postgres, SQLite ..) dan gratis yang Anda tidak perlu menginstal perangkat lunak apa pun untuk (kecuali Docker), lihat https://github.com/function61/sql2json
Pengungkapan penuh: Saya menulis perangkat lunak itu.
sumber
Ini adalah satu-satunya metode yang menampilkan JSON (array objek) yang valid .
( sumber )
sumber