chdb-io / chdb-go

Go bindings and cli for chDB, an in-process SQL OLAP Engine powered by ClickHouse
https://chdb.io
Apache License 2.0
84 stars 3 forks source link
chdb cli clickhouse golang

chDB-go

chdb-go

chDB go bindings and chDB cli.

Install

Install libchdb.so

  1. Install libchdb

Install chdb-go

  1. Install chdb-go
    • go install github.com/chdb-io/chdb-go@latest
  2. Run chdb-go with or without persistent --path
    • run $GOPATH/bin/chdb-go

or Build from source

  1. Build chdb-go
    • run make build
  2. Run chdb-go with or without persistent --path
    • run ./chdb-go

chdb-go CLI

  1. Simple mode
    ./chdb-go "SELECT 123"
    ./chdb-go "SELECT 123" JSON
  2. Interactive mode
    ./chdb-go # enter interactive mode, but data will be lost after exit
    ./chdb-go --path /tmp/chdb # interactive persistent mode
chdb-io/chdb-go [main] » ./chdb-go 
Enter your SQL commands; type 'exit' to quit.
 :) CREATE DATABASE IF NOT EXISTS testdb;

Go lib Example

package main

import (
    "fmt"
    "os"
    "path/filepath"

    "github.com/chdb-io/chdb-go/chdb"
)

func main() {
    // Stateless Query (ephemeral)
    result, err := chdb.Query("SELECT version()", "CSV")
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(result)

    tmp_path := filepath.Join(os.TempDir(), "chdb_test")
    defer os.RemoveAll(tmp_path)
    // Stateful Query (persistent)
    session, _ := chdb.NewSession(tmp_path)
    defer session.Cleanup()

    _, err = session.Query("CREATE DATABASE IF NOT EXISTS testdb; " +
        "CREATE TABLE IF NOT EXISTS testdb.testtable (id UInt32) ENGINE = MergeTree() ORDER BY id;")
    if err != nil {
        fmt.Println(err)
        return
    }

    _, err = session.Query("USE testdb; INSERT INTO testtable VALUES (1), (2), (3);")
    if err != nil {
        fmt.Println(err)
        return
    }

    ret, err := session.Query("SELECT * FROM testtable;")
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(ret)
    }
}

Go SQL driver for chDB

package main

import (
        "database/sql"
        "log"

        _ "github.com/chdb-io/chdb-go/chdb/driver"
)

func main() {
        db, err := sql.Open("chdb", "")
        if err != nil {
                log.Fatal(err)
        }
        rows, err := db.Query(`select COUNT(*) from url('https://datasets.clickhouse.com/hits_compatible/athena_partitioned/hits_0.parquet')`)
        if err != nil {
                log.Fatalf("select fail, err: %s", err)
        }
        cols, err := rows.Columns()
        if err != nil {
                log.Fatalf("get result columns fail, err: %s", err)
        }
        log.Printf("result columns: %v", cols)
        defer rows.Close()
        var count int
        for rows.Next() {
                err := rows.Scan(&count)
                if err != nil {
                        log.Fatalf("scan fail, err: %s", err)
                }
                log.Printf("count: %d", count)
        }
}

Golang API docs