Можно ли контролировать сериализацию JSONB? - PullRequest
0 голосов
/ 10 октября 2018

Я хочу экспортировать столбец jsonb в таблицу Postgres (v9.6).

Я попытался выполнить команду COPY:

\COPY (SELECT my_json_column FROM my_table) to 'data.json';

Я получил файл JSON, но мне бы хотелось две модификации:

  1. Я хочу сохранить пространство: без пробелов после разделителей : и ,.
  2. Я хочу равномерную и предсказуемую сортировку ключей.

Другими словами, я хочу поведение Python json.dump с аргументами

  1. separators=(',',':')
  2. sort_keys=True

(Это формат загруженного файла, и я хочу экспортировать его в тот же формат, чтобы проверить, что в оба концаэто личность.)

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Нет встроенных опций для форматирования вывода jsonb.Вы можете использовать PL / Python.

create extension if not exists plpython3u;

На данный момент (Postgres 10) вы должны использовать Абстрактные деревья синтаксиса для преобразования Postgres jsonb в объект Python(автоматическое преобразование будет возможно в следующих выпусках).

create or replace function format_jsonb(obj jsonb)
returns text language plpython3u as $$
    import json
    import ast
    js = ast.literal_eval(obj);
    return json.dumps(js, separators=(',', ':'), sort_keys=True)
$$;

Использование:

select format_jsonb('{"abcd": 1, "jklm": 2, "jkl": 3, "abc": 4}');

            format_jsonb             
-------------------------------------
 {"abc":4,"abcd":1,"jkl":3,"jklm":2}
(1 row)

Таким образом, ваша команда может выглядеть так:

\COPY (SELECT format_jsonb(my_json_column) FROM my_table) to 'data.json';
0 голосов
/ 10 октября 2018

Если вы хотите сохранить исходный формат, не используйте jsonb.Используйте json, который сохраняет значение при вводе.Даже с выходным массажем, который вы себе представляете, дубликаты ключей будут потеряны.

Если вам нужно jsonb средств, приведите колонку к jsonb на лету.Вы все еще можете быть эффективными, потому что вы можете добавить индекс как

CREATE INDEX ON mytab USING gin ((jsoncol::jsonb));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...