一、介绍
这里使用 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
存一些数据进去如下:
对应的结构体为 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)
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。