web-dev-qa-db-ja.com

Postgresテーブルをjsonとしてエクスポート

Postgresテーブルデータをjsonとしてファイルにエクスポートする方法はありますか?次のように、出力を行ごとに行う必要があります。

{'id':1,'name':'David'}
{'id':2,'name':'James'}
...

編集:postgresバージョン:9.3.4

39
AliBZ

PostgreSQLJSONの基本的な紹介については、 ここ を試してください。

また、PostgreSQLのドキュメントはかなり良いので、試してみてください herepretty_boolオプション。

あなたの最初の質問は、「postgresテーブルデータをJSONとしてエクスポートする方法はありますか?」でした。あなたはこのフォーマットでそれを望んだ

{'id':1,'name':'David'}
{'id':2,'name':'James'}
...

PostgreSQLの実行中のインスタンスがなかったため、9.4をダウンロード、コンパイル、およびインストールしました。

これに答えるために、まずテーブルをCREATEedしました(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');

次に、確認するには:

test=# select * from fred;

 mary | jimmy |      paulie      
------+-------+------------------
    2 |    43 | asfasfasfd
    3 |   435 | ererere
    6 | 43343 | eresdfssfsfasfae

次に、このコマンドを発行しました

test=# COPY (SELECT ROW_TO_JSON(t) 
test(# FROM (SELECT * FROM fred) t) 
test-# TO '/paulstuff/sware/db/postgres/inst/myfile';
COPY 3
test=# 

次に、psqlを終了し、ファイル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]$

(からの出力を試すことができます

COPY (SELECT ROW_TO_JSON(t, TRUE)  -- <-- Note addition of "TRUE" here!

お暇な時に)。

@ offby1は、出力(OPの質問に対応している間)が正しくないことを指摘しましたJSON。 @EvanCarrollはそのことを指摘しました\oはファイルに出力する方法でもあるため、このステートメントでこれら2つの微妙な問題の解決策を組み合わせました( here の助けを借りて):

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

与える:

[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]$ 

[〜#〜]最終的に[〜#〜]、バックスラッシュ(\)@AdamGentが彼の投稿で示唆した問題。これは少しトリッキーでしたが、クエリ後の処理に頼らずに可能です。ボイラ:

INSERT INTO fred VALUES (35, 5, 'wrew\sdfsd');
INSERT INTO fred VALUES (3, 44545, '\sdfs\\\sfs\\gf');

したがって、REGEXP_REPLACEを使用すると(キャスト:: TEXTに注意)、余分なブラックスラッシュが削除されます。

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

与える:

[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]$ 

(p.s. @Zoltánのコメントについて-これはバージョンのことかもしれません-再現できません!).

54
Vérace

psqlを使用している場合、\COPYを使用する理由はまったくありません。

\t
\a
\o file.json
SELECT row_to_json(r) FROM my_table AS r;

これは、簡単なテストのためにPostGISを使用してデータベースからpng/jpgs/tifsを取得し、PostgreSQL拡張機能を備えたスクリプトファイルを生成するために使用する方法と同じです。

15
Evan Carroll

私にとって@Véraceの答えは列名を維持しませんでしたが、デフォルト名(f1f2など)。 JSON拡張 を使用してPostgreSQL 9.1を使用しています。

テーブル全体をエクスポートする場合は、サブクエリは必要ありません。さらに、これは列名を維持します。私は次のクエリを使用しました:

COPY (SELECT row_to_json(t) FROM fred as t) to '/home/pol/Downloads/software/postgres/inst/myfile';
6
Zoltán

Veraceの回答 に特別な警告を追加します。 バックスラッシュ文字を含むテキスト列がある場合は、出力されたJSONファイルで後処理を行う必要があります:\

それ以外の場合は重複します(\-> \\)せいぜい、悪い場合には完全に無効なJSON:

この:

{ "f1" : "crap\""}.

なる

{ "f1" : "crap\\""}.

見た目は良いですが、完全に無効なJSONです。

\\から\ sed付き:

sed -i -e 's/\\\\/\\/g' PG_OUT_JSON_FILE.json

Postgres COPY から、彼らはそれについて言及します:

現在、COPY TOは8進数または16進数のバックスラッシュシーケンスを決して出力しませんが、これらの制御文字に対して上記にリストされた他のシーケンスを使用します。上記の表に記載されていないバックスラッシュ文字は、それ自体を表すものと見なされます。ただし、バックスラッシュを不必要に追加すると、データの終わりマーカー(。)またはnull文字列(デフォルトでは\ N)に一致する文字列が誤って生成される可能性があるため、注意してください。これらの文字列は、他のバックスラッシュ処理が行われる前に認識されます。

COPYデータを生成するアプリケーションは、データの改行と復帰をそれぞれ\ nと\ rシーケンスに変換することを強くお勧めします。現在、データキャリッジリターンをバックスラッシュとキャリッジリターンで表し、データ改行をバックスラッシュと改行で表すことができます。ただし、これらの表現は将来のリリースでは受け入れられなくなる可能性があります。また、COPYファイルが異なるマシン間で転送された場合(たとえば、UnixからWindowsへ、またはその逆)、破損に対して非常に脆弱です。

COPY TOは、各行をUnixスタイルの改行( "\ n")で終了します。 Microsoft Windowsで実行されているサーバーは、代わりにキャリッジリターン/改行( "\ r\n")を出力しますが、サーバーファイルへのCOPYの場合のみです。プラットフォーム間の一貫性を保つために、COPY TO STDOUTは、サーバープラットフォームに関係なく、常に「\ n」を送信します。 COPY FROMは、改行、改行、または改行/改行で終わる行を処理できます。データとして意図されたバックスラッシュされていない改行またはキャリッジリターンによるエラーのリスクを減らすために、入力の行末がすべて同じでない場合、COPY FROMは文句を言います。

5
Adam Gent

これは、有効なJSON(オブジェクトの配列)を出力する唯一のメソッドです。

\t
\a
\o data.json
select json_agg(t) FROM (SELECT * from table) t;

ソース

1
Gunar Gessner

ソフトウェア(Dockerを除く)をインストールする必要がない汎用(MySQL、Postgres、SQLite ..)および無料のソリューションについては、 https://github.com/function61/sql2json を参照してください。

完全な開示:私はそのソフトウェアを書きました。

1
joonas.fi