package main
import (
"database/sql"
"fmt"
"time"
_ "github.com/ClickHouse/clickhouse-go"
)
// 连接池的最大数量
const maxConnections = 10
func connect() (*sql.DB, error) {
// 创建连接池
pool, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true")
if err != nil {
return nil, err
}
// 设置连接池的最大连接数
pool.SetMaxOpenConns(maxConnections)
// 设置连接池中最多可以有多少空闲连接
pool.SetMaxIdleConns(maxConnections / 2)
// 设置连接的最大空闲时间
pool.SetConnMaxLifetime(time.Minute * 5)
// 测试连接是否可用
if err = pool.Ping(); err != nil {
return nil, err
}
return pool, nil
}
func main() {
db, err := connect()
if err != nil {
panic(err)
}
defer db.Close()
// 构造插入语句
stmt := `
INSERT INTO mytable (id, name, age)
VALUES
`
for i := 0; i < 1000; i++ {
stmt += fmt.Sprintf("(%d, 'Name%d', %d),", i, i, i%100)
}
stmt = stmt[:len(stmt)-1]
// 执行插入语句
result, err := db.Exec(stmt)
if err != nil {
panic(err)
}
// 输出插入结果
fmt.Println(result.RowsAffected())
}
2. 如果有很多字段,可以这样写
package main
import (
"encoding/json"
"fmt"
"github.com/kshvakov/clickhouse"
)
type User map[string]interface{}
func main() {
// 连接clickhouse
ch, err := clickhouse.Open("tcp://127.0.0.1:9000?debug=true")
if err != nil {
fmt.Printf("Failed to connect to clickhouse: %v\n", err)
return
}
defer ch.Close()
// 解析json数据
var users []User
if err := json.Unmarshal([]byte(jsonData), &users); err != nil {
fmt.Printf("Failed to parse json data: %v\n", err)
return
}
// 获取json数据中的所有键
keys := make([]string, 0, len(users[0]))
for key := range users[0] {
keys = append(keys, key)
}
// 构造插入语句
stmt := fmt.Sprintf("INSERT INTO mytable (%s) VALUES", strings.Join(keys, ", "))
// 插入json数据
insert, err := ch.Insert(stmt)
if err != nil {
fmt.Printf("Failed to create insert statement: %v\n", err)
return
}
for _, user := range users {
values := make([]interface{}, 0, len(keys))
for _, key := range keys {
values = append(values, user[key])
}
if err := insert.Send(values); err != nil {
fmt.Printf("Failed to send data: %v\n", err)
return
}
}
if err := insert.Close(); err != nil {
fmt.Printf("Failed to close insert statement: %v\n", err)
return
}
}