[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.당신은 테이블에 정보를 삽입 그것을 추출하는 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.명시 적으로 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.파일에서 수입 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로 입력을 변환합니다.
from https://stackoverflow.com/questions/39224382/how-can-i-import-a-json-file-into-postgresql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] Linq는 계층 적 데이터 - 옵션 및 성능 (0) | 2020.04.10 |
---|---|
[SQL] RODBC SQL 쿼리에 R 변수를 전달? [복제] (0) | 2020.04.10 |
[SQL] 왜 관계 설정 기반의 쿼리는 커서보다는 더 낫다? (0) | 2020.04.10 |
[SQL] T-SQL은 구분에 따라 문자열을 분할 (0) | 2020.04.10 |
[SQL] 업데이트에 참여하기위한 MySQL의 구문 (0) | 2020.04.10 |