go使用連接池連接clickhouse

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
    }
}

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章