package db import ( "fmt" "github.com/go-redis/redis/v8" "gorm.io/driver/clickhouse" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/schema" "net/url" ) func InitMysql(username, password, address, port, dbName string) (*gorm.DB, error) { dsn := fmt.Sprintf("%v:%v@tcp(%v:%v)/%v?charset=utf8mb4&parseTime=True&loc=Local", username, password, address, port, dbName) db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ Logger: &dbLogger{}, NamingStrategy: schema.NamingStrategy{ SingularTable: true, // 使用单数表名 }, }) return db, err } func InitRedis(password, address, port string, dbName int) (*redis.Client, error) { rdb := redis.NewClient(&redis.Options{Addr: fmt.Sprintf("%v:%v", address, port), Password: password, DB: dbName}) if rdb == nil { return nil, fmt.Errorf("init redis fail") } return rdb, nil } func InitClickHouse(host, port, user, password, database string) (*gorm.DB, error) { password = url.QueryEscape(password) dsn := fmt.Sprintf("clickhouse://%v:%v?database=%v&username=%v&password=%v&read_timeout=10s", host, port, database, user, password) fmt.Println(dsn) db, err := gorm.Open(clickhouse.Open(dsn), &gorm.Config{ Logger: &dbLogger{}, NamingStrategy: schema.NamingStrategy{ SingularTable: true, // 使用单数表名 }, }) return db, err } func AutoMigrateClickHouse(db *gorm.DB, tableOptions string, table any) error { // 带ClickHouse引擎的迁移 //return db.Set("gorm:table_options", "ENGINE=MergeTree() ORDER BY tuple()").AutoMigrate(table) return db.Set("gorm:table_options", tableOptions).AutoMigrate(table) } func InitClickHouse2(host, port, user, password, database string) (*ClickHouseRepo, error) { ch := NewClickHouseRepo(host, port, user, password, database) return ch, ch.Open() }