Есть ли способ экспортировать данные таблицы postgres как json в файл? Мне нужно, чтобы вывод был построчно, например:
{'id':1,'name':'David'}
{'id':2,'name':'James'}
...
РЕДАКТИРОВАТЬ: postgres версия: 9.3.4
Есть ли способ экспортировать данные таблицы postgres как json в файл? Мне нужно, чтобы вывод был построчно, например:
{'id':1,'name':'David'}
{'id':2,'name':'James'}
...
РЕДАКТИРОВАТЬ: postgres версия: 9.3.4
Попробуйте здесь для основного введения в PostgreSQL
и JSON
.
Кроме того, документация PostgreSQL довольно хорошая, так что попробуйте здесь . Проверьте pretty_bool
вариант.
Ваш первоначальный вопрос был «Есть ли способ экспортировать данные таблицы postgres как JSON
». Вы хотели это в этом формате
{'id':1,'name':'David'}
{'id':2,'name':'James'}
...
У меня не было запущенного экземпляра, PostgreSQL
поэтому я скачал, скомпилировал и установил 9.4.
Чтобы ответить на это, я сначала CREATE
отредактировал таблицу (Фред)
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 указал, что вывод (хотя и соответствует вопросу ОП) не верен 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
дает:
[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, таким образом (обратите внимание на cast :: 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]$
(ps Что касается комментария @ Zoltán - это может быть версия версии - невозможно воспроизвести!).
backslash
в ваших колонках !!!! Внимательно прочитайте документ COPY, так как он выполняет специальные функции дляbackslash
персонажей (например, добавляет еще одну обратную косую черту).Если вы используете,
psql
то нет никаких оснований для использования\COPY
вообще.Это тот же метод, который мы используем для извлечения png / jpgs / tifs из базы данных с PostGIS для быстрых тестов, а также для создания файлов сценариев с расширениями PostgreSQL.
источник
psql
-native-команды - это самый простой способ скопировать в относительный путь ! PS: существует «терминальный способ» использования реальной команды COPY с относительным путем, см. Здесь .psql -h remotehost -d remote_mydb -U myuser -c "COPY (SELECT '{\"x\":1,\"y\":[\"a\",2]}'::json AS r) TO STDOUT" > ./relative_path/file.csv
Для меня ответ @Vérace не содержал имена столбцов, а присваивал им имена по умолчанию (
f1
,f2
и т. Д.). Я использую PostgreSQL 9.1 с расширением JSON .Если вы хотите экспортировать всю таблицу, подзапрос не требуется. Кроме того, это будет поддерживать имена столбцов. Я использовал следующий запрос:
источник
CREATE TABLE fred (mary INT, jimmy INT, paulie VARCHAR(20));
и результат:{"mary":2,"jimmy":43,"paulie":"asfasfasfd"}
- имена полей: mary, jimmy, paulie ... и NOT (f1
,f2
и т. д.) ...Я добавлю специальное предостережение к ответу Веры . Вам нужно сделать постобработку на выводимый файл JSON , если у вас есть текстовые столбцы с обратной косой чертой:
\
.В противном случае вы получите дубликат (
\
->\\
) в лучшем случае и совершенно неверный JSON в худшем случае, т.е.Это:
становится
Который выглядит хорошо, но совершенно неверный JSON.
Вы можете заменить
\\
на\
sed:От Postgres COPY, где они об этом упоминают:
источник
Для общего (MySQL, Postgres, SQLite ..) и бесплатного решения, для которого вам не нужно устанавливать какое-либо программное обеспечение (кроме Docker), см. Https://github.com/function61/sql2json
Полное раскрытие: я написал это программное обеспечение.
источник
Это единственный метод, который выводит допустимый JSON (массив объектов).
( источник )
источник