chDB-go proporciona bindings de Go para chDB, lo que te permite ejecutar consultas de ClickHouse directamente en tus aplicaciones de Go sin dependencias externas.
Primero, instala la biblioteca chDB:
curl -sL https://lib.chdb.io | bash
Instala el paquete para Go:
go install github.com/chdb-io/chdb-go@latest
O bien, añádelo a tu go.mod:
go get github.com/chdb-io/chdb-go
Interfaz de línea de comandos
chDB-go incluye una CLI para consultas rápidas:
# Consulta simple
./chdb-go "SELECT 123"
# Modo interactivo
./chdb-go
# Modo interactivo con almacenamiento persistente
./chdb-go --path /tmp/chdb
Biblioteca de Go - guía de inicio rápido
Para consultas simples y aisladas:
package main
import (
"fmt"
"github.com/chdb-io/chdb-go/chdb"
)
func main() {
// Ejecutar una consulta simple
result, err := chdb.Query("SELECT version()", "CSV")
if err != nil {
panic(err)
}
fmt.Println(result)
}
Para consultas complejas con estado persistente:
package main
import (
"fmt"
"github.com/chdb-io/chdb-go/chdb"
)
func main() {
// Crear una sesión con almacenamiento persistente
session, err := chdb.NewSession("/tmp/chdb-data")
if err != nil {
panic(err)
}
defer session.Cleanup()
// Crear base de datos y tabla
_, 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)
}
// Insertar datos
_, err = session.Query(`
INSERT INTO testdb.test_table VALUES
(1, 'Alice'), (2, 'Bob'), (3, 'Charlie')
`, "")
if err != nil {
panic(err)
}
// Consultar datos
result, err := session.Query("SELECT * FROM testdb.test_table ORDER BY id", "Pretty")
if err != nil {
panic(err)
}
fmt.Println(result)
}
chDB-go implementa la interfaz database/sql de Go:
package main
import (
"database/sql"
"fmt"
_ "github.com/chdb-io/chdb-go/chdb/driver"
)
func main() {
// Abrir conexión a la base de datos
db, err := sql.Open("chdb", "")
if err != nil {
panic(err)
}
defer db.Close()
// Consulta con la interfaz estándar 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)
}
}
Consultas en streaming para grandes conjuntos de datos
Para procesar grandes conjuntos de datos que no caben en memoria, use consultas en streaming:
package main
import (
"fmt"
"log"
"github.com/chdb-io/chdb-go/chdb"
)
func main() {
// Crear una sesión para consultas de streaming
session, err := chdb.NewSession("/tmp/chdb-stream")
if err != nil {
log.Fatal(err)
}
defer session.Cleanup()
// Ejecutar una consulta de streaming para un conjunto de datos grande
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
// Procesar datos en fragmentos
for {
chunk := streamResult.GetNext()
if chunk == nil {
// No hay más datos
break
}
// Comprobar errores de streaming
if err := streamResult.Error(); err != nil {
log.Printf("Streaming error: %v", err)
break
}
rowsRead := chunk.RowsRead()
// Aquí se pueden procesar los datos del fragmento
// Por ejemplo, escribir en un archivo, enviar por red, 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)
}
Beneficios del streaming de consultas:
- Eficiencia de memoria - Procesa grandes conjuntos de datos sin cargarlo todo en memoria
- Procesamiento en tiempo real - Empieza a procesar los datos en cuanto llega el primer fragmento
- Compatibilidad con cancelación - Permite cancelar consultas de larga duración con
Cancel()
- Gestión de errores - Comprueba si hay errores durante el streaming con
Error()
chDB-go ofrece APIs de alto y bajo nivel:
- Go 1.21 o posterior
- Compatible con Linux y macOS
Última modificación el 10 de junio de 2026