在我正在开发的项目中,我需要将Postgres数据库中的潜在大型数据集流式传输到客户端,以进行分析。
该应用程序是在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
这样可行,但它会将每一行都作为键值对产生,例如:
["{\"id\":403457,\"email\":\"email403457@example.com\",\"first_name\":\"Firstname403457\",\"last_name\":\"Lastname403457\",\"source\":\"adwords\",\"created_at\":\"2015-08-05T22:43:07.295796\",\"updated_at\":\"2017-01-19T04:48:29.464051\"}"]
本着最小化响应大小(以字节为单位)的精神,特别是因为这是通过Web提供的,我想只为每一行返回一个值数组,即:
["[403457, \"email403457@example.com\", \"Firstname403457\", \"Lastname403457\", \"adwords\", \"2015-08-05T22:43:07.295796\", \"2017-01-19T04:48:29.464051\"]"]
有没有办法在Postgres中实现这一点,即使是通过嵌套函数,从上面的查询开始?
答案 0 :(得分:1)
您可以创建一个简单的SQL函数,将行转换为所需的格式:
CREATE FUNCTION row2json(anyelement) RETURNS json
LANGUAGE sql STABLE AS
'SELECT json_agg(z.value) FROM json_each(row_to_json($1)) z';
然后使用它来转换输出:
SELECT row2json(mytab) FROM mytab;
如果性能比JSON输出更重要,只需将结果转换为字符串:
SELECT CAST(mytab AS text) FROM mytab;