Как импортировать файл JSON в PostgreSQL?

например у меня есть файл customers.json который является массивом объектов (строго сформированных) , и это довольно просто (без вложенных объектов), как это (что важно: это уже включает идентификаторы):

[
  {
    "id": 23635,
    "name": "Jerry Green",
    "comment": "Imported from facebook."
  },
  {
    "id": 23636,
    "name": "John Wayne",
    "comment": "Imported from facebook."
  }
]

и я хочу импортировать их все в мою БД postgres в таблицу customers.

я нашел несколько довольно сложных способов, когда я должен импортировать его как столбец JSON в таблицу, такую как imported_json и столбец с именем data с объектами, перечисленными там, а затем использовать sql для получения эти значения и вставьте его в реальную таблицу.

но есть ли простой способ импорта json в postgres без касания sql?

3 ответов


вы можете ввести JSON в инструкцию SQL, которая извлекает информацию и вставляет ее в таблицу. Если атрибуты JSON имеют точно такое же имя, как столбцы таблицы, вы можете сделать что-то вроде этого:

with customer_json (doc) as (
   values 
    ('[
      {
        "id": 23635,
        "name": "Jerry Green",
        "comment": "Imported from facebook."
      },
      {
        "id": 23636,
        "name": "John Wayne",
        "comment": "Imported from facebook."
      }
    ]'::json)
)
insert into customer (id, name, comment)
select p.*
from customer_json l
  cross join lateral json_populate_recordset(null::customer, doc) as p
on conflict (id) do update 
  set name = excluded.name, 
      comment = excluded.comment;

новые клиенты будут вставлены, существующие будут обновлены. "Волшебная" часть-это json_populate_recordset(null::customer, doc) который генерирует реляционное представление объектов JSON.


вышеизложенное предполагает определение таблицы, как это:

create table customer 
(
  id        integer primary key,
  name      text not null,
  comment   text
);

если данные предоставлены в виде файла, вам нужно сначала поместить этот файл в некоторую таблицу в базе данных. Что-то вроде этого:--9-->

create unlogged table customer_import (doc json);

затем загрузите файл в одну строку этой таблицы, например, используя на psql (или все, что предлагает ваш клиент SQL):

\copy customer_import from 'customers.json' ....

затем вы можете использовать вышеуказанный оператор, просто удалите CTE и используйте промежуточную таблицу:

insert into customer (id, name, comment)
select p.*
from customer_import l
  cross join lateral json_populate_recordset(null::customer, doc) as p
on conflict (id) do update 
  set name = excluded.name, 
      comment = excluded.comment;

оказывается, есть простой способ импортировать многострочный объект JSON в столбец JSON в базе данных postgres с помощью инструмента командной строки psql, без необходимости явно вставлять JSON в инструкцию SQL. Техника документирована в postgresql docs, но это немного скрыто.

трюк состоит в том, чтобы загрузить JSON в переменную psql с помощью backticks. Например, учитывая многострочный файл JSON в / tmp / test.в JSON такие as:

{
  "dog": "cat",
  "frog": "frat"
}

мы можем использовать следующий SQL для загрузки его во временную таблицу:

sql> \set content `cat /tmp/test.json`
sql> create temp table t ( j jsonb );
sql> insert into t values (:'content');
sql> select * from t;

который дает результат:

               j                
────────────────────────────────
 {"dog": "cat", "frog": "frat"}
(1 row)

вы также можете выполнять операции с данными напрямую:

sql> select :'content'::jsonb -> 'dog';
 ?column? 
──────────
 "cat"
(1 row)

под одеялом это is просто встраивание JSON в SQL, но гораздо аккуратнее позволить psql выполнять интерполяцию самостоятельно.


чтобы улучшить ваше решение в командной строке Windows psql, нам нужно использовать "type" вместо "cat" для чтения .файл json

i.e \установить содержимое type /tmp/test.json