복붙노트

[SQL] 어떻게 PostgreSQL을로 JSON 파일을 가져올 수 있습니까?

SQL

어떻게 PostgreSQL을로 JSON 파일을 가져올 수 있습니까?

(중요한 것은 : 그것은 이미 ID를 포함) 예를 들어 나는 물체 (엄격하게 형성)의 배열 인 파일 customers.json을 가지고 있고 그것은 다음과 같이 (중첩 된 객체없이) 꽤 평범 :

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

그리고 DB 테이블의 고객으로 내 포스트 그레스에 그들 모두를 가져올.

나는 이러한 값을 얻을 진짜 테이블에 삽입 한 후 사용 SQL에 나열된 개체 imported_json 및 열 이름 데이터와 같은 테이블에 JSON 형식의 열로 가져와야합니다 꽤 어려운 방법을 발견했다.

그러나 SQL없이 감동과 포스트 그레스에 JSON을 가져 오는 간단한 방법은 무엇입니까?

해결법

  1. ==============================

    1.당신은 테이블에 정보를 삽입 그것을 추출하는 SQL 문에 JSON을 공급할 수 있습니다. json으로 속성이 테이블 열 정확히 이름이있는 경우는 다음과 같이 할 수 있습니다 :

    당신은 테이블에 정보를 삽입 그것을 추출하는 SQL 문에 JSON을 공급할 수 있습니다. 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 JSON 객체 관계형 표현을 생성 (널 (null) : 고객, 문서)입니다.

    위의이 같은 테이블 정의를 가정합니다 :

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

    데이터를 파일로 제공되는 경우, 데이터베이스의 일부 테이블에 먼저 넣어 해당 파일이 필요합니다. 이 같은:

    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;
    
  2. ==============================

    2.명시 적으로 SQL 문에 JSON을 포함하지 않고, 명령 줄 psql의 도구를 사용하여 포스트 그레스 데이터베이스에서 JSON 컬럼에 여러 줄의 JSON 개체를 가져올 수있는 쉬운 방법이 밖으로 그것은 변합니다. 이 기술은 PostgreSQL의 문서에 설명하지만, 약간 숨겨져있다.

    명시 적으로 SQL 문에 JSON을 포함하지 않고, 명령 줄 psql의 도구를 사용하여 포스트 그레스 데이터베이스에서 JSON 컬럼에 여러 줄의 JSON 개체를 가져올 수있는 쉬운 방법이 밖으로 그것은 변합니다. 이 기술은 PostgreSQL의 문서에 설명하지만, 약간 숨겨져있다.

    비결은 역 따옴표를 사용하여 psql의 변수로 JSON을로드하는 것입니다. 예를 들어, /tmp/test.json 등의 여러 줄 JSON 파일을 제공 :

    {
      "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)
    

    내부적으로이 단지 SQL에서 JSON을 내장되지만 psql의는 보간 자체를 수행 할 수 있도록 많이 깔끔한입니다.

  3. ==============================

    3.파일에서 수입 JSON으로 가장 간단한 방법은로 표시 파일에서 하나의 JSON을 가져올 수 없습니다 오히려 하나의 열 CSV : 한 줄 jsons의 목록 :

    파일에서 수입 JSON으로 가장 간단한 방법은로 표시 파일에서 하나의 JSON을 가져올 수 없습니다 오히려 하나의 열 CSV : 한 줄 jsons의 목록 :

    data.json :

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

    다음, psql의 아래 :

    create table t ( j jsonb )
    \copy t from 'd:\path\data.json'
    

    JSON (라인) 당 하나 개의 레코드 t 테이블에 추가됩니다.

    수입 "복사 \"CSV 위해 만들어진, 그리고 같은되었다 로드 데이터 라인으로 라인. 한 줄에 하나의 JSON을 읽는 결과 단일 JSON 배열 나중에 splited 될보다는 중간 테이블을 사용하지 않습니다.

    더 당신이 당신의 입력 JSON 파일이 너무 큰 경우에 발생합니다 최대 입력 라인 크기 제한을 공격하지 않을의.

    나는 이렇게 먼저 복사 명령을 사용하여 가져 오는 하나의 열 CSV로 입력을 변환합니다.

  4. from https://stackoverflow.com/questions/39224382/how-can-i-import-a-json-file-into-postgresql by cc-by-sa and MIT license