Перейти к основному содержанию
Перейти к основному содержанию

chDB для Go

chDB-go предоставляет биндинги Go к chDB, позволяя выполнять запросы к ClickHouse напрямую в ваших Go‑приложениях без каких-либо внешних зависимостей.

Установка

Шаг 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 предоставляет утилиту командной строки для быстрых запросов:

# Простой запрос \{#simple-query}
./chdb-go "SELECT 123"

Интерактивный режим

./chdb-go

Интерактивный режим с постоянным хранилищем данных

./chdb-go --path /tmp/chdb


### Библиотека Go — быстрый старт                \{#quick-start}

#### Запросы без состояния                      \{#stateless-queries}

Для простых разовых запросов:

```go
package main

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

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"
)

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-драйвера

chDB-go реализует интерфейс database/sql из стандартной библиотеки Go:

package main

import (
    "database/sql"
    "fmt"
    _ "github.com/chdb-io/chdb-go/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("Количество: %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("Обработана порция из %d строк\n", rowsRead)
        rowCount += int(rowsRead)
        if rowCount%100000 == 0 {
            fmt.Printf("Обработано %d строк...\n", rowCount)
        }
    }
    
    fmt.Printf("Всего обработано строк: %d\n", rowCount)
}

Преимущества потокового выполнения запросов:

  • Эффективное использование памяти - Обрабатывайте большие наборы данных, не загружая их полностью в память
  • Обработка в реальном времени - Начинайте обработку данных, как только поступит первый фрагмент
  • Поддержка отмены - Можно отменять длительные запросы с помощью Cancel()
  • Обработка ошибок - Проверяйте наличие ошибок во время потоковой обработки с помощью Error()

Документация по API

chDB-go предоставляет как высокоуровневый, так и низкоуровневый API:

Системные требования

  • Go 1.21 или новее
  • Совместимо с Linux и macOS