私が取り組んでいるプロジェクトでは、分析目的のために、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';
は、あなたが出力を変換するためにそれを使用:
お返事ありがとうございます。このアプローチは機能しますが、私はストリーミング能力を失います。私。 Postgresは行を1つずつ与えるのではなく、結果ブロック全体を返します。これは私が与えた例で起こるものです。 – coconup
真。私はその法案に合わせて答えを変えました。 –
あなたは男@ laurenz-albe :)です。受け入れとアップボーディング。現実の世界に戻って、パフォーマンスの低下が重要である(キーと値のペアの出発点の3倍の遅さ)ので、実際にこれを実行するかどうかを確認する必要があります。あなたが投稿した機能の中で最適化のための余地があるのですか、それとも本当に唯一の方法ですか? – coconup