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=#
@offby1 指出输出(虽然对应于 OP 的问题)不正确JSON。@EvanCarroll 指出这\o也是一种输出到文件的方式,所以我在这个语句中结合了这两个小问题的解决方案(在此处的帮助下):
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
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
COPY TO 将使用 Unix 样式的换行符 ("\n") 终止每一行。在 Microsoft Windows 上运行的服务器改为输出回车/换行符 ("\r\n"),但仅用于 COPY 到服务器文件;为了跨平台的一致性,无论服务器平台如何,COPY TO STDOUT 总是发送“\n”。COPY FROM 可以处理以换行符、回车符或回车符/换行符结尾的行。为了降低由于作为数据的非反斜杠换行符或回车而导致的错误风险,如果输入中的行结尾不完全相同,COPY FROM 会报错。
在这里尝试了解
PostgreSQL
和的基本介绍JSON
。另外,PostgreSQL 文档也很不错,所以在这里试试。查看
pretty_bool
选项。您最初的问题是“有没有办法将 postgres 表数据导出为
JSON
”。你想要这种格式我没有运行的实例,
PostgreSQL
所以我下载、编译并安装了 9.4。为了回答这个问题,我首先
CREATE
编辑了一张表 (fred)然后,检查:
然后我发出了这个命令
然后我退出 psql 并列出文件 myfile.
(您可以尝试从
闲暇时)。
@offby1 指出输出(虽然对应于 OP 的问题)不正确
JSON
。@EvanCarroll 指出这\o
也是一种输出到文件的方式,所以我在这个语句中结合了这两个小问题的解决方案(在此处的帮助下):给出:
最后,@ AdamGent
\
在他的帖子中提到了反斜杠 ( ) 问题。这有点棘手,但无需借助查询后处理即可。瞧:并因此使用 REGEXP_REPLACE(注意演员表 ::TEXT)删除了多余的黑斜线。
给出:
(ps 至于@Zoltán 的评论 - 这可能是一个版本的东西 - 无法重现!)。
如果您正在使用,
psql
那么根本没有理由使用\COPY
。这与我们使用 PostGIS 从数据库中获取 png/jpgs/tifs 以进行快速测试以及生成具有 PostgreSQL 扩展名的脚本文件的方法相同。
请在下面找到输出实际有效 JSON(即对象数组)的唯一答案。
(来源)
对我来说,@Vérace 的答案没有保留列名,而是分配了默认名称(
f1
,f2
等)。我正在使用带有JSON 扩展名的 PostgreSQL 9.1 。如果要导出整个表,则不需要子查询。此外,这将维护列名。我使用了以下查询:
我将在Verace 的回答中添加一个特别警告。如果您有带有反斜杠字符的文本列,则需要对输出的 JSON 文件进行后处理:
\
.否则,您最多会得到重复(
\
->\\
),更糟糕的是完全无效的 JSON,即:这个:
变成
看起来不错,但 JSON 完全无效。
您可以将
\\
into替换为\
sed:从他们提到的Postgres COPY中:
对于无需安装任何软件(Docker 除外)的通用(MySQL、Postgres、SQLite..)和免费解决方案,请参阅https://github.com/function61/sql2json
完全披露:我编写了那个软件。
使用spyql很容易实现:
我们使用 psql 将查询/表导出为 CSV,然后使用 spyql 将 CSV 转换为 json 行。
作为记录,我使用以下 SQL 命令创建了一个示例表:
免责声明:我是spyql的作者
@gunar-gessner 答案的变体,但带有内联指定的输出文件