一、介绍

这里使用 https://github.com/ClickHouse/clickhouse-go
来做go语言调用clickhouse数据的 client 库
我们会从一般数据库的,增删改查,来介绍简单的使用。

使用1.x版本的 clickhouse-go
引入下面两个包就可以使用

"github.com/ClickHouse/clickhouse-go"
"github.com/jmoiron/sqlx"

创建clickhouse 表

CREATE TABLE testhi.hi_test_user (
    `id` Nullable(Int64), 
    `age` Nullable(Int64), 
    `name` Nullable(String)
) ENGINE = Memory

存一些数据进去如下:
image.png

对应的结构体为 User,字段通过tag与数据库中hi_test_user表的列一致。

type User struct {
    Id   int64  `db:"id"`
    Name string `db:"name"`
    Age  int64  `db:"age"`
}

这里使用 sqlx 库来解析sql,连接clickhouse
https://github.com/jmoiron/sqlx
具体的使用方法,可以参考上面地址文档。
为什么使用 sqlx 而不是go 原生的 database/sql
这个和我们使用gorm,xorm连接mysql一样,
原生的database/sql在封装上,需要自己操作,不如sqlx使用了方便。

二、增

package clickhouse_

import (
    "fmt"
    _ "github.com/ClickHouse/clickhouse-go"
    "github.com/jmoiron/sqlx"
    "log"
    "strconv"
    "testing"
)

func TestAdd(t *testing.T) {
    source := "tcp://127.0.0.1:9001?debug=true&username=root&password=123456&database=testhi"
    connect, err := sqlx.Connect("clickhouse", source)
    if err != nil {
        fmt.Printf("clickhouse open err %s", err.Error())
    }
    defer func() {
        _ = connect.Close()
    }()

    //数据预处理写入
    tx, err := connect.Begin()
    if err != nil {
        log.Fatal(err)
    }
    stmt, err := tx.Prepare("insert into testhi.hi_test_user (id,name,age) values(?,?,?)")
    if err != nil {
        log.Fatal(err)
    }
    for i := 10; i < 20; i++ {
        if _, err := stmt.Exec(i, "n"+strconv.Itoa(i), i+10); err != nil {
            log.Fatal(err)
        }
    }
    _ = tx.Commit()
}

三、删

四、改

五、查

package clickhouse_

import (
    "fmt"
    _ "github.com/ClickHouse/clickhouse-go"
    "github.com/jmoiron/sqlx"
    "log"
    "testing"
)

type User struct {
    Id   int64  `db:"id"`
    Name string `db:"name"`
    Age  int64  `db:"age"`
}

func TestSelect(t *testing.T) {
    source := "tcp://127.0.0.1:9001?debug=true&username=root&password=123456&database=testhi"
    connect, err := sqlx.Connect("clickhouse", source)
    if err != nil {
        fmt.Printf("clickhouse open err %s", err.Error())
    }
    defer func() {
        _ = connect.Close()
    }()

    var items []User
    if err := connect.Select(&items, "select * from testhi.hi_test_user limit 10"); err != nil {
        log.Fatal(err)
    }
    for _, item := range items {
        fmt.Printf("id: %d, name: %s, age: %d\n", item.Id, item.Name, item.Age)
    }
}

谢谢您的观看,欢迎关注我的公众号。

image.png