연결
default 사용자로 접근할 수 있다고 가정할 때 ClickHouse에 연결하는 방법을 보여줍니다.
연결에는 기본 네이티브 포트를 사용합니다.
conn 변수가 이미 생성되어 사용 가능한 상태라고 가정합니다.
실행
Exec 메서드로 실행할 수 있습니다. 이는 DDL과 간단한 SQL 문에 유용합니다. 대량 삽입이나 쿼리를 반복 처리하는 용도로는 사용하지 않는 것이 좋습니다.
배치 삽입
Send() 메서드로 전송됩니다. 배치는 Send가 실행될 때까지 메모리에 유지됩니다.
연결 누수를 방지하려면 배치에 대해 Close를 호출하는 것이 좋습니다. 이는 배치를 준비한 직후 defer 키워드를 사용해 처리할 수 있습니다. 이렇게 하면 Send가 호출되지 않더라도 연결이 정리됩니다. 단, 행이 하나도 추가되지 않았다면 쿼리 로그에는 0개의 행이 삽입된 것으로 표시됩니다.
임시 컬럼
행 조회
QueryRow 메서드를 사용해 단일 행을 쿼리하거나, Query를 통해 결과 집합을 순회할 수 있는 커서를 얻을 수 있습니다. 전자는 데이터를 직렬화해 저장할 대상을 받지만, 후자는 각 행마다 Scan을 호출해야 합니다.
SELECT 문에 지정된 순서대로 전달해야 하며, 위와 같은 SELECT *의 경우 기본적으로 컬럼 선언 순서가 사용됩니다.
삽입과 마찬가지로 Scan 메서드도 대상 변수가 적절한 타입이어야 합니다. 이 역시 가능한 경우 타입 변환이 이루어지도록 유연하게 설계되어 있으며, 정밀도 손실이 없을 때만 변환됩니다. 예를 들어 위 예시에서는 UUID 컬럼을 string 변수로 읽어옵니다. 각 컬럼 타입에 대해 지원되는 Go 타입의 전체 목록은 타입 변환을 참조하십시오.
마지막으로, Query 및 QueryRow 메서드에 Context를 전달할 수 있다는 점에도 유의하십시오. 이는 쿼리 수준 설정에 사용할 수 있습니다. 자세한 내용은 Using Context를 참조하십시오.
비동기 삽입
열 지향 삽입
구조체 사용하기
serialize와 함께 사용하는 Select
구조체 스캔
ScanStruct를 사용하면 쿼리의 단일 행을 구조체로 마샬링할 수 있습니다.
구조체 추가
AppendStruct를 사용하면 기존 배치에 구조체를 추가할 수 있으며, 이 구조체는 완전한 행으로 해석됩니다. 이때 구조체의 필드는 이름과 유형이 모두 테이블과 일치해야 합니다. 모든 컬럼에는 이에 대응하는 구조체 필드가 있어야 하지만, 일부 구조체 필드에는 대응되는 컬럼이 없을 수 있습니다. 이러한 필드는 무시됩니다.
매개변수 바인딩
Exec, Query, QueryRow 메서드에서 매개변수 바인딩을 지원합니다. 아래 예시와 같이 이름 있는 매개변수, 번호 매겨진 매개변수, 위치 매개변수를 사용할 수 있습니다. 각 방식의 예시는 아래에 나와 있습니다.
특수한 경우
[ ]로 감싼 값 집합을 주입해야 하는 경우 ArraySet을 사용해야 합니다.
그룹/튜플이 필요하고, 예를 들어 IN 연산자와 함께 사용하기 위해 ( )로 감싸야 하는 경우 GroupSet을 사용할 수 있습니다. 이는 아래 예시와 같이 여러 그룹이 필요한 경우에 특히 유용합니다.
마지막으로, DateTime64 필드는 매개변수가 올바르게 렌더링되도록 하려면 정밀도가 필요합니다. 하지만 필드의 정밀도 수준은 클라이언트가 알 수 없으므로 사용자가 직접 제공해야 합니다. 이를 쉽게 처리할 수 있도록 DateNamed 매개변수를 제공합니다.
Context 사용
context.Background()를 사용했지만, 이 기능을 사용하면 설정과 마감 시간을 전달하고 쿼리를 취소할 수 있습니다.
withDeadline으로 생성한 Context를 전달하면 쿼리에 실행 시간 제한을 설정할 수 있습니다. 이는 절대 시간을 기준으로 하며, 만료되면 연결만 해제되고 ClickHouse에 취소 신호만 전송된다는 점에 유의하십시오. 또는 WithCancel을 사용해 쿼리를 명시적으로 취소할 수도 있습니다.
도우미 함수 clickhouse.WithQueryID와 clickhouse.WithQuotaKey를 사용하면 쿼리 ID와 쿼터 키를 지정할 수 있습니다. 쿼리 ID는 로그에서 쿼리를 추적하거나 취소할 때 유용합니다. 쿼터 키는 고유한 키 값을 기준으로 ClickHouse 사용량에 제한을 적용하는 데 사용할 수 있습니다. 자세한 내용은 Quotas Management를 참조하십시오.
또한 Context를 사용하면 Connection Settings에 나와 있는 것처럼 연결 전체가 아니라 특정 쿼리에만 설정이 적용되도록 할 수 있습니다.
마지막으로 clickhouse.WithBlockSize를 통해 블록 버퍼 크기를 제어할 수 있습니다. 이는 연결 수준 설정인 BlockBufferSize를 재정의하며, 한 번에 디코딩되어 메모리에 유지되는 블록의 최대 개수를 제어합니다. 값을 크게 하면 메모리 사용량이 늘어나는 대신 더 높은 수준의 병렬 처리가 가능해질 수 있습니다.
위에서 설명한 내용의 예시는 아래와 같습니다.
Progress, profile 및 log 정보
동적 스캔
외부 테이블
ext.NewTable로 외부 테이블을 생성해야 합니다.
OpenTelemetry
clickhouse.WithSpan을 사용해 Context를 통해 쿼리에 스팬을 첨부하세요.
HTTP 전송 제한ClickHouse 서버는 표준
traceparent / tracestate HTTP 헤더를 수신하지만, clickhouse-go의 HTTP 전송은 현재 이를 보내지 않으므로 HTTP에서는 WithSpan이 적용되지 않습니다. 우회 방법으로 연결 옵션의 HttpHeaders를 통해 헤더를 수동으로 설정할 수 있습니다.