VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
vsql_http 확장은 http_get(), http_post()와 전체 HTTP 메서드를 SQL에 직접 추가하므로, 데이터가 있는 바로 그곳에서 외부 API를 호출할 수 있습니다.
문제: 모든 API 호출마다 데이터베이스를 떠남
VillageSQL이 없을 때의 일반적인 패턴:VillageSQL과 함께: SQL에서 HTTP
http_get(url)은 GET 요청을 보내고 전체 응답을 담은 JSON 문자열을 반환합니다.
vsql_http의 모든 함수는 같은 JSON 형태를 반환합니다:
문자 집합 변환
VillageSQL 0.0.6 이하에서는 VEF STRING 함수가 binary 문자 집합을 반환합니다. 결과를JSON_VALUE나 JSON_EXTRACT에 전달하기 전에 CONVERT(... USING utf8mb4)로 감싸세요:
CONVERT가 더 이상 필요하지 않습니다 — 하지만 유지해도 해롭지 않으며, 아래의 모든 예제는 0.0.6 이하와의 호환성을 위해 여전히 사용합니다. 캐스트를 반복하지 않으려면 CONVERT로 변수에 한 번 할당하고 그 변수를 재사용하세요.
POST 요청
http_post(url, content_type, body)는 본문이 있는 POST를 보냅니다:
사용자 정의 헤더와 기타 메서드
http_request(method, url, headers_json, body, content_type, options_json)는 사용자 정의 헤더와 함께 모든 메서드를 처리합니다:
headers_json 인자는 키가 헤더 이름이고 값이 헤더 값인 JSON 객체입니다.
사용 가능한 모든 함수
모든 함수는 NULL 입력에 NULL을 반환합니다. 연결 실패(연결 거부, DNS 실패, 타임아웃) 시 HTTP 함수는 마찬가지로 NULL을 반환하고 curl의 오류 메시지를 담은 경고를 발생시킵니다 — 요청이 사라진 것처럼 보이면
SHOW WARNINGS로 확인하세요.
URL 인코딩
url_encode()와 url_decode()는 쿼리 매개변수의 퍼센트 인코딩을 처리합니다:
알려진 제한 사항
256KB 응답 상한 — 256KB보다 큰 응답은 잘립니다. 이것은 SQL 쿼리에서 쓰이는 일반적인 API 페이로드를 충분히 다루지만, 큰 파일 다운로드에는 적합하지 않습니다. 이 상한으로 잘린 응답은 더 이상 유효한 JSON이 아닙니다:JSON_EXTRACT/JSON_UNQUOTE는 이에 대해 ERROR 3141을 발생시키고, JSON_VALUE는 기본 NULL ON ERROR 동작에 따라 오류 대신 Warning 3141과 함께 NULL을 반환합니다.
JSON_VALUE 크기 제한 — JSON_VALUE는 추출된 값이 MySQL의 내부 크기 제한을 초과하면 NULL을 반환합니다. 큰 응답 본문에는 대신 JSON_UNQUOTE(JSON_EXTRACT(...))를 사용하세요:
max_execution_time은 블로킹 중인 vsql_http 호출을 제한하거나 중단하지 않습니다 — 느리거나 도달할 수 없는 엔드포인트는 그와 관계없이 자체 연결/읽기 타임아웃 동안 문장을 붙잡습니다. http_get/http_post/http_put/http_delete/http_patch는 옵션을 받지 않습니다. http_request(method, url, headers_json, body, content_type, options_json)만 options_json 인자에 초 단위 {"timeout": N}으로 타임아웃을 받습니다(기본값 30). 타임아웃을 줄여야 할 때는 축약 함수 대신 http_request를 사용하세요(HTTP 웹훅 참조).
문제 해결
다음 단계
- API 데이터로 행 보강하기 — 실시간 외부 데이터를 쿼리 결과로 가져오기
- 트리거에서 웹훅 보내기 — 행 변경을 외부 서비스로 자동으로 밀어 보내기
참고
- 외부 API 데이터로 행 보강하기 — HTTP 기반 데이터 보강의 실용적 패턴
- 트리거에서 웹훅 보내기 — 트리거에서의 이벤트 기반 HTTP 호출
- MySQL의 JSON — HTTP 요청이 반환하는 JSON 응답 파싱
- 테이블을 REST API로 제공하기 — 요청을 보내는 대신 HTTP에 응답하는 같은 서버