메인 콘텐츠로 건너뛰기
chDB-go는 chDB용 Go 바인딩을 제공하므로, 별도의 외부 종속성 없이 Go 애플리케이션에서 직접 ClickHouse 쿼리를 실행할 수 있습니다.

설치

1단계: libchdb 설치

먼저 chDB 라이브러리를 설치합니다:
curl -sL https://lib.chdb.io | bash

2단계: chdb-go 설치

Go 패키지를 설치하세요:
go install github.com/chdb-io/chdb-go@latest
또는 go.mod에 추가하세요:
go get github.com/chdb-io/chdb-go

사용법

명령줄 인터페이스

chDB-go에는 빠르게 쿼리할 수 있는 CLI가 포함되어 있습니다.
# 간단한 쿼리
./chdb-go "SELECT 123"

# 대화형 모드
./chdb-go

# 영구 저장소를 사용하는 대화형 모드
./chdb-go --path /tmp/chdb

Go 라이브러리 - 빠른 시작

세션 없는 쿼리

간단한 일회성 쿼리의 경우:
package main

import (
    "fmt"
    "github.com/chdb-io/chdb-go/chdb"
)

func main() {
    // 간단한 쿼리 실행
    result, err := chdb.Query("SELECT version()", "CSV")
    if err != nil {
        panic(err)
    }
    fmt.Println(result)
}

세션을 사용하는 상태 유지형 쿼리

지속적으로 상태를 유지해야 하는 복잡한 쿼리의 경우:
package main

import (
    "fmt"
    "github.com/chdb-io/chdb-go/chdb"
)

func main() {
    // 영구 저장소로 세션 생성
    session, err := chdb.NewSession("/tmp/chdb-data")
    if err != nil {
        panic(err)
    }
    defer session.Cleanup()

    // 데이터베이스 및 테이블 생성
    _, err = session.Query(`
        CREATE DATABASE IF NOT EXISTS testdb;
        CREATE TABLE IF NOT EXISTS testdb.test_table (
            id UInt32,
            name String
        ) ENGINE = MergeTree() ORDER BY id
    `, "")
    
    if err != nil {
        panic(err)
    }

    // 데이터 삽입
    _, err = session.Query(`
        INSERT INTO testdb.test_table VALUES 
        (1, 'Alice'), (2, 'Bob'), (3, 'Charlie')
    `, "")
    
    if err != nil {
        panic(err)
    }

    // 데이터 쿼리
    result, err := session.Query("SELECT * FROM testdb.test_table ORDER BY id", "Pretty")
    if err != nil {
        panic(err)
    }
    
    fmt.Println(result)
}

SQL driver 인터페이스

chDB-go는 Go의 database/sql 인터페이스를 구현합니다.
package main

import (
    "database/sql"
    "fmt"
    _ "github.com/chdb-io/chdb-go/chdb/driver"
)

func main() {
    // 데이터베이스 연결 열기
    db, err := sql.Open("chdb", "")
    if err != nil {
        panic(err)
    }
    defer db.Close()

    // 표준 database/sql 인터페이스로 쿼리 실행
    rows, err := db.Query("SELECT COUNT(*) FROM url('https://datasets.clickhouse.com/hits/hits.parquet')")
    if err != nil {
        panic(err)
    }
    defer rows.Close()

    for rows.Next() {
        var count int
        err := rows.Scan(&count)
        if err != nil {
            panic(err)
        }
        fmt.Printf("Count: %d\n", count)
    }
}

대규모 데이터셋을 위한 스트리밍 쿼리

메모리에 모두 적재할 수 없는 대규모 데이터셋을 처리하려면 스트리밍 쿼리를 사용하십시오:
package main

import (
    "fmt"
    "log"
    "github.com/chdb-io/chdb-go/chdb"
)

func main() {
    // 스트리밍 쿼리를 위한 세션 생성
    session, err := chdb.NewSession("/tmp/chdb-stream")
    if err != nil {
        log.Fatal(err)
    }
    defer session.Cleanup()

    // 대용량 데이터셋에 대한 스트리밍 쿼리 실행
    streamResult, err := session.QueryStreaming(
        "SELECT number, number * 2 as double FROM system.numbers LIMIT 1000000", 
        "CSV",
    )
    if err != nil {
        log.Fatal(err)
    }
    defer streamResult.Free()

    rowCount := 0
    
    // 청크 단위로 데이터 처리
    for {
        chunk := streamResult.GetNext()
        if chunk == nil {
            // 더 이상 데이터 없음
            break
        }
        
        // 스트리밍 오류 확인
        if err := streamResult.Error(); err != nil {
            log.Printf("Streaming error: %v", err)
            break
        }
        
        rowsRead := chunk.RowsRead()
        // 여기서 청크 데이터를 처리할 수 있습니다
        // 예시: 파일에 쓰기, 네트워크로 전송 등
        fmt.Printf("Processed chunk with %d rows\n", rowsRead)
        rowCount += int(rowsRead)
        if rowCount%100000 == 0 {
            fmt.Printf("Processed %d rows so far...\n", rowCount)
        }
    }
    
    fmt.Printf("Total rows processed: %d\n", rowCount)
}
쿼리 스트리밍의 이점:
  • 메모리 효율성 - 전체를 메모리에 로드하지 않고도 대규모 데이터셋을 처리합니다
  • 실시간 처리 - 첫 번째 청크가 도착하자마자 데이터 처리를 시작합니다
  • 취소 지원 - Cancel()로 오래 실행되는 쿼리를 취소할 수 있습니다
  • 오류 처리 - 스트리밍 중 Error()로 오류를 확인할 수 있습니다

API 문서

chDB-go는 고수준 API와 저수준 API를 모두 제공합니다.

시스템 요구 사항

  • Go 1.21 이상
  • Linux 및 macOS와 호환됩니다
마지막 수정일 2026년 6월 10일