diff --git a/gorm.go b/gorm.go index 720de0a..d541c28 100644 --- a/gorm.go +++ b/gorm.go @@ -10,9 +10,20 @@ import ( ) type ConfigGormClient struct { - Dns string // 地址 - Log bool // 日志 - LogUrl string // 日志路径 + Dns string // 地址 + Log struct { + Status bool // 状态 + Path string // 路径 + Slow int64 // 慢SQL阈值 + Level string // 级别 + NotFoundError bool // 忽略ErrRecordNotFound(记录未找到)错误 + Colorful bool // 禁用彩色打印 + } // 日志 + Conn struct { + SetMaxIdle int // 设置空闲连接池中连接的最大数量 + SetMaxOpen int // 设置打开数据库连接的最大数量 + SetConnMaxLifetime int64 // 设置了连接可复用的最大时间 + } // 连接 } // GormClient diff --git a/gorm_mysql.go b/gorm_mysql.go index 826bf50..182db01 100644 --- a/gorm_mysql.go +++ b/gorm_mysql.go @@ -16,19 +16,35 @@ func NewGormMysqlClient(config *ConfigGormClient) (*GormClient, error) { c := &GormClient{config: config} // 判断路径 - if c.config.LogUrl == "" { + if c.config.Log.Path == "" { logsUrl = "/logs/mysql" + } else { + logsUrl = c.config.Log.Path } - if c.config.Log == true { + if c.config.Log.Status == true { + var slowThreshold time.Duration + var logLevel logger.LogLevel + if c.config.Log.Slow == 0 { + slowThreshold = 100 * time.Millisecond + } else { + slowThreshold = time.Duration(c.config.Log.Slow) + } + if c.config.Log.Level == "Error" { + logLevel = logger.Error + } else if c.config.Log.Level == "Warn" { + logLevel = logger.Warn + } else { + logLevel = logger.Info + } c.Db, err = gorm.Open(mysql.Open(c.config.Dns), &gorm.Config{ Logger: logger.New( writer{}, logger.Config{ - SlowThreshold: time.Second, // 慢 SQL 阈值 - LogLevel: logger.Info, // 日志级别 - IgnoreRecordNotFoundError: true, // 忽略ErrRecordNotFound(记录未找到)错误 - Colorful: false, // 禁用彩色打印 + SlowThreshold: slowThreshold, // 慢SQL阈值 + LogLevel: logLevel, // 日志级别 + IgnoreRecordNotFoundError: c.config.Log.NotFoundError, // 忽略ErrRecordNotFound(记录未找到)错误 + Colorful: c.config.Log.Colorful, // 禁用彩色打印 }, ), NowFunc: func() time.Time { @@ -48,9 +64,26 @@ func NewGormMysqlClient(config *ConfigGormClient) (*GormClient, error) { return nil, errors.New(fmt.Sprintf("检查连接失败:%v", err)) } - sqlDB.SetMaxIdleConns(10) // 设置空闲连接池中连接的最大数量 - sqlDB.SetMaxOpenConns(100) // 设置打开数据库连接的最大数量。 - sqlDB.SetConnMaxLifetime(time.Second * 600) // 设置了连接可复用的最大时间。 + // 设置空闲连接池中连接的最大数量 + if c.config.Conn.SetMaxIdle == 0 { + sqlDB.SetMaxIdleConns(10) + } else { + sqlDB.SetMaxIdleConns(c.config.Conn.SetMaxIdle) + } + + // 设置打开数据库连接的最大数量 + if c.config.Conn.SetMaxOpen == 0 { + sqlDB.SetMaxOpenConns(100) + } else { + sqlDB.SetMaxOpenConns(c.config.Conn.SetMaxOpen) + } + + // 设置了连接可复用的最大时间 + if c.config.Conn.SetConnMaxLifetime == 0 { + sqlDB.SetConnMaxLifetime(time.Second * 600) + } else { + sqlDB.SetConnMaxLifetime(time.Duration(c.config.Conn.SetConnMaxLifetime)) + } return c, nil } diff --git a/gorm_postgresql.go b/gorm_postgresql.go index e52f28e..2caf842 100644 --- a/gorm_postgresql.go +++ b/gorm_postgresql.go @@ -12,25 +12,40 @@ import ( func NewGormPostgresClient(config *ConfigGormClient) (*GormClient, error) { + var err error c := &GormClient{} c.config = config // 判断路径 - if c.config.LogUrl == "" { + if c.config.Log.Path == "" { logsUrl = "/logs/postgresql" + } else { + logsUrl = c.config.Log.Path } - var err error - - if c.config.Log == true { + if c.config.Log.Status == true { + var slowThreshold time.Duration + var logLevel logger.LogLevel + if c.config.Log.Slow == 0 { + slowThreshold = 100 * time.Millisecond + } else { + slowThreshold = time.Duration(c.config.Log.Slow) + } + if c.config.Log.Level == "Error" { + logLevel = logger.Error + } else if c.config.Log.Level == "Warn" { + logLevel = logger.Warn + } else { + logLevel = logger.Info + } c.Db, err = gorm.Open(postgres.Open(c.config.Dns), &gorm.Config{ Logger: logger.New( writer{}, logger.Config{ - SlowThreshold: time.Second, // 慢 SQL 阈值 - LogLevel: logger.Info, // 日志级别 - IgnoreRecordNotFoundError: true, // 忽略ErrRecordNotFound(记录未找到)错误 - Colorful: false, // 禁用彩色打印 + SlowThreshold: slowThreshold, // 慢SQL阈值 + LogLevel: logLevel, // 日志级别 + IgnoreRecordNotFoundError: c.config.Log.NotFoundError, // 忽略ErrRecordNotFound(记录未找到)错误 + Colorful: c.config.Log.Colorful, // 禁用彩色打印 }, ), NowFunc: func() time.Time { @@ -50,34 +65,66 @@ func NewGormPostgresClient(config *ConfigGormClient) (*GormClient, error) { return nil, errors.New(fmt.Sprintf("检查连接失败:%v", err)) } - sqlDB.SetMaxIdleConns(10) // 设置空闲连接池中连接的最大数量 - sqlDB.SetMaxOpenConns(100) // 设置打开数据库连接的最大数量。 - sqlDB.SetConnMaxLifetime(time.Second * 600) // 设置了连接可复用的最大时间。 + // 设置空闲连接池中连接的最大数量 + if c.config.Conn.SetMaxIdle == 0 { + sqlDB.SetMaxIdleConns(10) + } else { + sqlDB.SetMaxIdleConns(c.config.Conn.SetMaxIdle) + } + + // 设置打开数据库连接的最大数量 + if c.config.Conn.SetMaxOpen == 0 { + sqlDB.SetMaxOpenConns(100) + } else { + sqlDB.SetMaxOpenConns(c.config.Conn.SetMaxOpen) + } + + // 设置了连接可复用的最大时间 + if c.config.Conn.SetConnMaxLifetime == 0 { + sqlDB.SetConnMaxLifetime(time.Second * 600) + } else { + sqlDB.SetConnMaxLifetime(time.Duration(c.config.Conn.SetConnMaxLifetime)) + } return c, nil } func NewGormPostgresqlClient(config *ConfigGormClient) (*GormClient, error) { + var err error c := &GormClient{} c.config = config // 判断路径 - if c.config.LogUrl == "" { + if c.config.Log.Path == "" { logsUrl = "/logs/postgresql" + } else { + logsUrl = c.config.Log.Path } - var err error - - if c.config.Log == true { + if c.config.Log.Status == true { + var slowThreshold time.Duration + var logLevel logger.LogLevel + if c.config.Log.Slow == 0 { + slowThreshold = 100 * time.Millisecond + } else { + slowThreshold = time.Duration(c.config.Log.Slow) + } + if c.config.Log.Level == "Error" { + logLevel = logger.Error + } else if c.config.Log.Level == "Warn" { + logLevel = logger.Warn + } else { + logLevel = logger.Info + } c.Db, err = gorm.Open(postgres.Open(c.config.Dns), &gorm.Config{ Logger: logger.New( writer{}, logger.Config{ - SlowThreshold: time.Second, // 慢 SQL 阈值 - LogLevel: logger.Info, // 日志级别 - IgnoreRecordNotFoundError: true, // 忽略ErrRecordNotFound(记录未找到)错误 - Colorful: false, // 禁用彩色打印 + SlowThreshold: slowThreshold, // 慢SQL阈值 + LogLevel: logLevel, // 日志级别 + IgnoreRecordNotFoundError: c.config.Log.NotFoundError, // 忽略ErrRecordNotFound(记录未找到)错误 + Colorful: c.config.Log.Colorful, // 禁用彩色打印 }, ), NowFunc: func() time.Time { @@ -97,9 +144,26 @@ func NewGormPostgresqlClient(config *ConfigGormClient) (*GormClient, error) { return nil, errors.New(fmt.Sprintf("检查连接失败:%v", err)) } - sqlDB.SetMaxIdleConns(10) // 设置空闲连接池中连接的最大数量 - sqlDB.SetMaxOpenConns(100) // 设置打开数据库连接的最大数量。 - sqlDB.SetConnMaxLifetime(time.Second * 600) // 设置了连接可复用的最大时间。 + // 设置空闲连接池中连接的最大数量 + if c.config.Conn.SetMaxIdle == 0 { + sqlDB.SetMaxIdleConns(10) + } else { + sqlDB.SetMaxIdleConns(c.config.Conn.SetMaxIdle) + } + + // 设置打开数据库连接的最大数量 + if c.config.Conn.SetMaxOpen == 0 { + sqlDB.SetMaxOpenConns(100) + } else { + sqlDB.SetMaxOpenConns(c.config.Conn.SetMaxOpen) + } + + // 设置了连接可复用的最大时间 + if c.config.Conn.SetConnMaxLifetime == 0 { + sqlDB.SetConnMaxLifetime(time.Second * 600) + } else { + sqlDB.SetConnMaxLifetime(time.Duration(c.config.Conn.SetConnMaxLifetime)) + } return c, nil } diff --git a/gorm_sqlite.go b/gorm_sqlite.go new file mode 100644 index 0000000..08504c1 --- /dev/null +++ b/gorm_sqlite.go @@ -0,0 +1,89 @@ +package dorm + +import ( + "errors" + "fmt" + "github.com/dtapps/go-library/utils/gotime" + "github.com/glebarez/sqlite" + "gorm.io/gorm" + "gorm.io/gorm/logger" + "time" +) + +func NewGormSqliteClient(config *ConfigGormClient) (*GormClient, error) { + + var err error + c := &GormClient{config: config} + + // 判断路径 + if c.config.Log.Path == "" { + logsUrl = "/logs/sqlite" + } else { + logsUrl = c.config.Log.Path + } + + if c.config.Log.Status == true { + var slowThreshold time.Duration + var logLevel logger.LogLevel + if c.config.Log.Slow == 0 { + slowThreshold = 100 * time.Millisecond + } else { + slowThreshold = time.Duration(c.config.Log.Slow) + } + if c.config.Log.Level == "Error" { + logLevel = logger.Error + } else if c.config.Log.Level == "Warn" { + logLevel = logger.Warn + } else { + logLevel = logger.Info + } + c.Db, err = gorm.Open(sqlite.Open(c.config.Dns), &gorm.Config{ + Logger: logger.New( + writer{}, + logger.Config{ + SlowThreshold: slowThreshold, // 慢SQL阈值 + LogLevel: logLevel, // 日志级别 + IgnoreRecordNotFoundError: c.config.Log.NotFoundError, // 忽略ErrRecordNotFound(记录未找到)错误 + Colorful: c.config.Log.Colorful, // 禁用彩色打印 + }, + ), + NowFunc: func() time.Time { + return gotime.Current().Now().Local() + }, + }) + } else { + c.Db, err = gorm.Open(sqlite.Open(c.config.Dns), &gorm.Config{}) + } + + if err != nil { + return nil, errors.New(fmt.Sprintf("连接失败:%v", err)) + } + + sqlDB, err := c.Db.DB() + if err != nil { + return nil, errors.New(fmt.Sprintf("检查连接失败:%v", err)) + } + + // 设置空闲连接池中连接的最大数量 + if c.config.Conn.SetMaxIdle == 0 { + sqlDB.SetMaxIdleConns(10) + } else { + sqlDB.SetMaxIdleConns(c.config.Conn.SetMaxIdle) + } + + // 设置打开数据库连接的最大数量 + if c.config.Conn.SetMaxOpen == 0 { + sqlDB.SetMaxOpenConns(100) + } else { + sqlDB.SetMaxOpenConns(c.config.Conn.SetMaxOpen) + } + + // 设置了连接可复用的最大时间 + if c.config.Conn.SetConnMaxLifetime == 0 { + sqlDB.SetConnMaxLifetime(time.Second * 600) + } else { + sqlDB.SetConnMaxLifetime(time.Duration(c.config.Conn.SetConnMaxLifetime)) + } + + return c, nil +} diff --git a/gorm_sqlite_cgo.go b/gorm_sqlite_cgo.go new file mode 100644 index 0000000..d34267d --- /dev/null +++ b/gorm_sqlite_cgo.go @@ -0,0 +1,89 @@ +package dorm + +import ( + "errors" + "fmt" + "github.com/dtapps/go-library/utils/gotime" + "gorm.io/driver/sqlite" + "gorm.io/gorm" + "gorm.io/gorm/logger" + "time" +) + +func NewGormSqliteCgoClient(config *ConfigGormClient) (*GormClient, error) { + + var err error + c := &GormClient{config: config} + + // 判断路径 + if c.config.Log.Path == "" { + logsUrl = "/logs/sqlite" + } else { + logsUrl = c.config.Log.Path + } + + if c.config.Log.Status == true { + var slowThreshold time.Duration + var logLevel logger.LogLevel + if c.config.Log.Slow == 0 { + slowThreshold = 100 * time.Millisecond + } else { + slowThreshold = time.Duration(c.config.Log.Slow) + } + if c.config.Log.Level == "Error" { + logLevel = logger.Error + } else if c.config.Log.Level == "Warn" { + logLevel = logger.Warn + } else { + logLevel = logger.Info + } + c.Db, err = gorm.Open(sqlite.Open(c.config.Dns), &gorm.Config{ + Logger: logger.New( + writer{}, + logger.Config{ + SlowThreshold: slowThreshold, // 慢SQL阈值 + LogLevel: logLevel, // 日志级别 + IgnoreRecordNotFoundError: c.config.Log.NotFoundError, // 忽略ErrRecordNotFound(记录未找到)错误 + Colorful: c.config.Log.Colorful, // 禁用彩色打印 + }, + ), + NowFunc: func() time.Time { + return gotime.Current().Now().Local() + }, + }) + } else { + c.Db, err = gorm.Open(sqlite.Open(c.config.Dns), &gorm.Config{}) + } + + if err != nil { + return nil, errors.New(fmt.Sprintf("连接失败:%v", err)) + } + + sqlDB, err := c.Db.DB() + if err != nil { + return nil, errors.New(fmt.Sprintf("检查连接失败:%v", err)) + } + + // 设置空闲连接池中连接的最大数量 + if c.config.Conn.SetMaxIdle == 0 { + sqlDB.SetMaxIdleConns(10) + } else { + sqlDB.SetMaxIdleConns(c.config.Conn.SetMaxIdle) + } + + // 设置打开数据库连接的最大数量 + if c.config.Conn.SetMaxOpen == 0 { + sqlDB.SetMaxOpenConns(100) + } else { + sqlDB.SetMaxOpenConns(c.config.Conn.SetMaxOpen) + } + + // 设置了连接可复用的最大时间 + if c.config.Conn.SetConnMaxLifetime == 0 { + sqlDB.SetConnMaxLifetime(time.Second * 600) + } else { + sqlDB.SetConnMaxLifetime(time.Duration(c.config.Conn.SetConnMaxLifetime)) + } + + return c, nil +} diff --git a/gorm_sqlserver.go b/gorm_sqlserver.go index 89bd8bf..14bbbe9 100644 --- a/gorm_sqlserver.go +++ b/gorm_sqlserver.go @@ -16,19 +16,35 @@ func NewGormSqlServerClient(config *ConfigGormClient) (*GormClient, error) { c := &GormClient{config: config} // 判断路径 - if c.config.LogUrl == "" { + if c.config.Log.Path == "" { logsUrl = "/logs/sqlserver" + } else { + logsUrl = c.config.Log.Path } - if c.config.Log == true { + if c.config.Log.Status == true { + var slowThreshold time.Duration + var logLevel logger.LogLevel + if c.config.Log.Slow == 0 { + slowThreshold = 100 * time.Millisecond + } else { + slowThreshold = time.Duration(c.config.Log.Slow) + } + if c.config.Log.Level == "Error" { + logLevel = logger.Error + } else if c.config.Log.Level == "Warn" { + logLevel = logger.Warn + } else { + logLevel = logger.Info + } c.Db, err = gorm.Open(sqlserver.Open(c.config.Dns), &gorm.Config{ Logger: logger.New( writer{}, logger.Config{ - SlowThreshold: time.Second, // 慢 SQL 阈值 - LogLevel: logger.Info, // 日志级别 - IgnoreRecordNotFoundError: true, // 忽略ErrRecordNotFound(记录未找到)错误 - Colorful: false, // 禁用彩色打印 + SlowThreshold: slowThreshold, // 慢SQL阈值 + LogLevel: logLevel, // 日志级别 + IgnoreRecordNotFoundError: c.config.Log.NotFoundError, // 忽略ErrRecordNotFound(记录未找到)错误 + Colorful: c.config.Log.Colorful, // 禁用彩色打印 }, ), NowFunc: func() time.Time { @@ -48,9 +64,26 @@ func NewGormSqlServerClient(config *ConfigGormClient) (*GormClient, error) { return nil, errors.New(fmt.Sprintf("检查连接失败:%v", err)) } - sqlDB.SetMaxIdleConns(10) // 设置空闲连接池中连接的最大数量 - sqlDB.SetMaxOpenConns(100) // 设置打开数据库连接的最大数量。 - sqlDB.SetConnMaxLifetime(time.Second * 600) // 设置了连接可复用的最大时间。 + // 设置空闲连接池中连接的最大数量 + if c.config.Conn.SetMaxIdle == 0 { + sqlDB.SetMaxIdleConns(10) + } else { + sqlDB.SetMaxIdleConns(c.config.Conn.SetMaxIdle) + } + + // 设置打开数据库连接的最大数量 + if c.config.Conn.SetMaxOpen == 0 { + sqlDB.SetMaxOpenConns(100) + } else { + sqlDB.SetMaxOpenConns(c.config.Conn.SetMaxOpen) + } + + // 设置了连接可复用的最大时间 + if c.config.Conn.SetConnMaxLifetime == 0 { + sqlDB.SetConnMaxLifetime(time.Second * 600) + } else { + sqlDB.SetConnMaxLifetime(time.Duration(c.config.Conn.SetConnMaxLifetime)) + } return c, nil }