본문으로 건너뛰기
AZ Tools

JSON → SQL INSERT 생성기

JSON 객체 배열을 INSERT 문으로 — PostgreSQL·MySQL·SQLite·ANSI 인용, 선택적 ON CONFLICT upsert.

SQL(3)
INSERT INTO "users" ("id", "name", "email", "verified", "joined")
VALUES
  (1, 'Alice', 'alice@example.com', TRUE, '2024-01-15'),
  (2, 'Bob', 'bob@example.com', FALSE, '2024-03-22'),
  (3, 'Carol', NULL, TRUE, '2024-06-01');

문자열은 작은따옴표를 두 번 써서 이스케이프하며, MySQL에서는 백슬래시도 두 번 씁니다.

사용법

  1. JSON 객체 배열(또는 단일 객체) 붙여넣기.
  2. 테이블 이름·SQL 방언 설정.
  3. 다행 VALUES 토글로 단일 문, 끄면 행마다 INSERT. ON CONFLICT·ON DUPLICATE KEY UPDATE 원하면 upsert 토글.

자세한 설명

펼치기

JSON 배열(또는 객체 하나)을 붙여 넣으면 바로 실행할 수 있는 SQL 삽입문을 만들어 줍니다. 열은 모든 키의 합집합이고, 그 열이 없는 행에는 NULL이 들어갑니다. 문자열은 작은따옴표를 이스케이프하고, 숫자와 불리언은 리터럴이 되며, 중첩된 객체와 배열은 JSON으로 직렬화됩니다. 선택적으로 ON CONFLICT(포스트그레스와 SQLite)나 ON DUPLICATE KEY UPDATE(MySQL)를 붙일 수 있어 동기화 작업에 그대로 넣을 수 있습니다.

모든 키의 합집합을 취하는 결정이 들쭉날쭉한 배열을 돌아가게 만들고, 동시에 조용한 뜻밖의 일이 사는 곳이기도 합니다. 어떤 필드를 한 번도 갖지 않는 객체도 NULL이 든 열을 받게 되므로, 레코드 하나의 키에 난 오타가 실패하는 대신 문장에 열을 통째로 더합니다. 출력을 실행하기 전에 열 목록을 훑어보십시오. 오백 행 사이에서 emial 하나를 잡는 가장 빠른 방법입니다.

여기의 문자열 이스케이프는 작은따옴표를 겹치는 방식인데, SQL이 요구하는 것이 그것이고, 기본 모드에서 백슬래시를 이스케이프 문자로 취급하는 MySQL에서는 백슬래시도 겹칩니다. 출력이 유효해지기에는 그것으로 충분합니다. 다만 남의 입력을 받는 코드에서 매개변수 바인딩을 대신하지는 못합니다. 이 툴은 이미 눈앞에 있는 데이터를 위한 것입니다. 애플리케이션에서 문자열을 이어 붙여 만든 문장이 인젝션이 취하는 형태이고, 거기서의 해법은 더 나은 이스케이프가 아니라 자리표시자입니다.

중첩 구조는 JSON 문자열로 직렬화되는데, 합리적인 기본값이지만 늘 원하는 바는 아닙니다. 포스트그레스는 그 문자열을 json이나 jsonb 열에 받아 주지만 text 열에서는 그냥 글자로 저장하고, MySQL의 JSON 타입은 삽입할 때 검증합니다. 목적지 열이 문서형이 아니라 관계형이라면, 이 출력이 쓸모 있으려면 중첩 부분을 펼치거나 두 번째 테이블이 필요합니다.

업서트 절은 문법 말고도 다릅니다. 포스트그레스와 SQLite는 충돌 대상, 즉 충돌을 판정할 열이나 제약을 필요로 하지만, MySQL은 위반된 고유 키가 무엇이든 그 절을 적용합니다. 한쪽을 위해 쓴 문장을 다른 쪽에서 돌리면 파싱에 실패하거나 의도하지 않은 키로 갱신됩니다.

아주 큰 배열은 아주 큰 단일 문장이 되는데, 대부분의 서버에는 브라우저가 기꺼이 만들어 내는 크기보다 한참 낮은 패킷이나 문장 한도가 있습니다.

자주 묻는 질문

중첩 객체 처리?

JSON 직렬화 후 인용 문자열로 삽입. PostgreSQL·MySQL의 JSON/JSONB 컬럼은 바로 수용; SQLite는 TEXT로.

다행 vs 행별 INSERT 차이?

다행은 단일 INSERT INTO ... VALUES (…), (…), (…); — 대량 로드에서 훨씬 빠름. 행별은 N개 문 — 개별 행 주석 처리·부분 실패 예상 시 편함.

이 이스케이프만으로 SQL을 안전하게 실행할 수 있나?

작은따옴표(MySQL에서는 백슬래시도)를 이스케이프해서 구문상 올바른 문장을 만들 뿐이고, 적대적인 입력에 대해 안전하다는 뜻은 아니다. 생성된 SQL은 그냥 텍스트다. 실행하기 전에 읽어보라. 통제할 수 없는 곳에서 온 데이터라면 생성된 스크립트를 콘솔에 붙여넣지 말고, 매개변수화된 문장이나 COPY, LOAD DATA 같은 대량 적재 도구로 넣어라.

숫자가 따옴표에 묶여 나오거나 ID의 끝자리가 사라진 이유는?

타입은 테이블이 아니라 JSON을 따른다. JSON에 "42"처럼 문자열로 적혀 있으면 컬럼이 정수여도 따옴표 붙은 리터럴이 나온다. SQL에서 캐스팅하거나 JSON을 고쳐야 한다. 큰 식별자는 반대쪽 함정이다. JSON 숫자로 도착했다면 이 도구에 오기도 전에 이미 끝자리를 잃었을 수 있다. ID를 문자열로 실어 보내야 하는 이유가 이것이다.

관련 도구