chDB-go는 chDB용 Go 바인딩을 제공하며, 이를 통해 외부 의존성 없이 Go 애플리케이션에서 ClickHouse 쿼리를 직접 실행할 수 있습니다.
설치
libchdb 설치
먼저 chDB 라이브러리를 설치합니다:
curl -sL https://lib.chdb.io | bashchdb-go 설치
Go 패키지를 설치합니다:
go install github.com/chdb-io/chdb-go@latest또는 go.mod에 추가합니다:
go get github.com/chdb-io/chdb-go사용량
명령줄 인터페이스
chDB-go에는 쿼리를 빠르게 실행할 수 있는 CLI가 포함되어 있습니다:
# Simple query
./chdb-go "SELECT 123"
# Interactive mode
./chdb-go
# Interactive mode with persistent storage
./chdb-go --path /tmp/chdbGo 라이브러리 - 빠른 시작
상태를 유지하지 않는 쿼리
간단한 일회성 쿼리의 경우:
package main
import (
"fmt"
"github.com/chdb-io/chdb-go/chdb"
)
func main() {
// Execute a simple query
result, err := chdb.Query("SELECT version()", "CSV")
if err != nil {
panic(err)
}
fmt.Println(result)
}session 기반 상태 유지형 쿼리
지속적으로 유지되는 상태가 필요한 복잡한 쿼리의 경우:
package main
import (
"fmt"
"github.com/chdb-io/chdb-go/chdb"
)
func main() {
// Create a session with persistent storage
session, err := chdb.NewSession("/tmp/chdb-data")
if err != nil {
panic(err)
}
defer session.Cleanup()
// Create database and table
_, 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)
}
// Insert data
_, err = session.Query(`
INSERT INTO testdb.test_table VALUES
(1, 'Alice'), (2, 'Bob'), (3, 'Charlie')
`, "")
if err != nil {
panic(err)
}
// Query data
result, err := session.Query("SELECT * FROM testdb.test_table ORDER BY id", "Pretty")
if err != nil {
panic(err)
}
fmt.Println(result)
}SQL 드라이버 인터페이스
chDB-go는 Go의 database/sql 인터페이스를 구현합니다.
package main
import (
"database/sql"
"fmt"
_ "github.com/chdb-io/chdb-go/chdb/driver"
)
func main() {
// Open database connection
db, err := sql.Open("chdb", "")
if err != nil {
panic(err)
}
defer db.Close()
// Query with standard database/sql interface
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() {
// Create a session for streaming queries
session, err := chdb.NewSession("/tmp/chdb-stream")
if err != nil {
log.Fatal(err)
}
defer session.Cleanup()
// Execute a streaming query for large dataset
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
// Process data in chunks
for {
chunk := streamResult.GetNext()
if chunk == nil {
// No more data
break
}
// Check for streaming errors
if err := streamResult.Error(); err != nil {
log.Printf("Streaming error: %v", err)
break
}
rowsRead := chunk.RowsRead()
// You can process the chunk data here
// For example, write to file, send over network, etc.
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를 모두 제공합니다.
- 고수준 API 문서 - 대부분의 사용 사례에 권장됩니다
- 저수준 API 문서 - 세밀한 제어가 필요한 고급 사용 사례에 적합합니다
시스템 요구 사항
- Go 1.21 이상
- Linux 및 macOS와 호환