2017-07-19 17 views
0

私が取り組んでいるプロジェクトでは、分析目的のために、Postgresデータベースから潜在的に大きなデータセットをクライアントにストリームする必要があります。Postgres:値を返すrow_to_jsonの同等物はありますか?

アプリケーションが(この質問には無関係)のRailsで構築し、研究のビットの後、私は現在のPostgresでCOPYを使用してクエリ結果をストリーミングすることができるよさ:(興味を持っている人のために)

COPY (SELECT row_to_json(t) from (#{query}) t) TO STDOUT; 

ソース:

https://shift.infinite.red/fast-csv-report-generation-with-postgres-in-rails-d444d9b915ab

https://github.com/brianhempel/stream_json_demo

これは動作しますが、それyiel DSキーと値のペアとしてすべての行、例えば:

["{\"id\":403457,\"email\":\"[email protected]\",\"first_name\":\"Firstname403457\",\"last_name\":\"Lastname403457\",\"source\":\"adwords\",\"created_at\":\"2015-08-05T22:43:07.295796\",\"updated_at\":\"2017-01-19T04:48:29.464051\"}"] 

応答のサイズ(バイト単位)を最小化し、特にこのため、ウェブを介して提供されたばかりの精神で、私は返すようにしたいですつまり、すべての行の値の配列、:

["[403457, \"[email protected]\", \"Firstname403457\", \"Lastname403457\", \"adwords\", \"2015-08-05T22:43:07.295796\", \"2017-01-19T04:48:29.464051\"]"] 

Postgresの内にこれを達成する方法は、上記のクエリから始めて、でもネスティング機能により、ありますか?パフォーマンスはJSONよりも重要である場合

SELECT row2json(mytab) FROM mytab; 

:次に

CREATE FUNCTION row2json(anyelement) RETURNS json 
    LANGUAGE sql STABLE AS 
'SELECT json_agg(z.value) FROM json_each(row_to_json($1)) z'; 

は、あなたが出力を変換するためにそれを使用:

答えて

1

あなたは希望の形式に行を変換し、単純なSQL関数を作成することができます結果を文字列にキャストしてください:

SELECT CAST(mytab AS text) FROM mytab; 
+0

お返事ありがとうございます。このアプローチは機能しますが、私はストリーミング能力を失います。私。 Postgresは行を1つずつ与えるのではなく、結果ブロック全体を返します。これは私が与えた例で起こるものです。 – coconup

+0

真。私はその法案に合わせて答えを変えました。 –

+0

あなたは男@ laurenz-albe :)です。受け入れとアップボーディング。現実の世界に戻って、パフォーマンスの低下が重要である(キーと値のペアの出発点の3倍の遅さ)ので、実際にこれを実行するかどうかを確認する必要があります。あなたが投稿した機能の中で最適化のための余地があるのですか、それとも本当に唯一の方法ですか? – coconup

関連する問題