fox/db/clickhouse.go
2025-05-25 20:02:15 +08:00

67 lines
1.5 KiB
Go

package db
import (
"database/sql"
"fmt"
"github.com/ClickHouse/clickhouse-go/v2"
"time"
)
type ClickHouseRepo struct {
host string
port string
user string
password string
database string
connection *sql.DB
}
func NewClickHouseRepo(host, port, user, password, database string) *ClickHouseRepo {
return &ClickHouseRepo{
host: host,
port: port,
user: user,
password: password,
database: database,
}
}
func (c *ClickHouseRepo) Open() error {
c.connection = clickhouse.OpenDB(&clickhouse.Options{
Addr: []string{fmt.Sprintf("%v:%v", c.host, c.port)},
Auth: clickhouse.Auth{
Database: c.database,
Username: c.user,
Password: c.password,
},
Settings: clickhouse.Settings{
"max_execution_time": 60,
},
DialTimeout: 5 * time.Second,
Compression: &clickhouse.Compression{
Method: clickhouse.CompressionLZ4,
Level: 5,
},
Protocol: clickhouse.Native,
// Debug: true,
})
if c.connection == nil {
return fmt.Errorf("connect clickhouse fail")
}
c.connection.SetMaxIdleConns(5)
c.connection.SetMaxOpenConns(10)
c.connection.SetConnMaxLifetime(0)
return c.connection.Ping()
}
func (c *ClickHouseRepo) Close() {
_ = c.connection.Close()
}
func (c *ClickHouseRepo) Select(query string, args ...interface{}) (*sql.Rows, error) {
return c.connection.Query(query, args...)
}
func (c *ClickHouseRepo) Exec(query string, args ...interface{}) (sql.Result, error) {
return c.connection.Exec(query, args...)
}