package repo 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...) }