- update utils

master
李光春 2 years ago
parent 9e1190b2b6
commit d3e6db341f

@ -0,0 +1,161 @@
package dorm
import (
"errors"
"fmt"
"github.com/sirupsen/logrus"
"gorm.io/driver/mysql"
"gorm.io/driver/postgres"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"os"
"path"
"time"
)
type ConfigGormClient struct {
Dns string // 地址
Log bool // 日志
LogUrl string // 日志路径
}
type GormClient struct {
Db *gorm.DB // 驱动
config *ConfigGormClient // 配置
}
func NewGormMysqlClient(config *ConfigGormClient) (*GormClient, error) {
c := &GormClient{}
c.config = config
// 判断路径
if c.config.LogUrl == "" {
logsUrl = "/logs/mysql"
}
var err error
if c.config.Log == true {
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, // 禁用彩色打印
},
),
})
} else {
c.Db, err = gorm.Open(mysql.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))
}
sqlDB.SetMaxIdleConns(10) // 设置空闲连接池中连接的最大数量
sqlDB.SetMaxOpenConns(100) // 设置打开数据库连接的最大数量。
sqlDB.SetConnMaxLifetime(time.Second * 600) // 设置了连接可复用的最大时间。
return c, nil
}
func NewGormPostgresClient(config *ConfigGormClient) (*GormClient, error) {
c := &GormClient{}
c.config = config
// 判断路径
if c.config.LogUrl == "" {
logsUrl = "/logs/postgresql"
}
var err error
if c.config.Log == true {
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, // 禁用彩色打印
},
),
})
} else {
c.Db, err = gorm.Open(postgres.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))
}
sqlDB.SetMaxIdleConns(10) // 设置空闲连接池中连接的最大数量
sqlDB.SetMaxOpenConns(100) // 设置打开数据库连接的最大数量。
sqlDB.SetConnMaxLifetime(time.Second * 600) // 设置了连接可复用的最大时间。
return c, nil
}
func (c *GormClient) GetDb() *gorm.DB {
return c.Db
}
type writer struct{}
// 日志路径
var logsUrl = ""
func (w writer) Printf(format string, args ...interface{}) {
now := time.Now()
logFilePath := ""
if dir, err := os.Getwd(); err == nil {
logFilePath = dir + logsUrl
}
if err := os.MkdirAll(logFilePath, 0777); err != nil {
fmt.Println(err.Error())
}
logFileName := "gorm." + now.Format("2006-01-02") + ".log"
// 日志文件
fileName := path.Join(logFilePath, logFileName)
if _, err := os.Stat(fileName); err != nil {
if _, err := os.Create(fileName); err != nil {
fmt.Println(err.Error())
}
}
// 写入文件
src, err := os.OpenFile(fileName, os.O_APPEND|os.O_WRONLY, os.ModeAppend)
if err != nil {
fmt.Println("err", err)
}
// 实例化
l := logrus.New()
// 设置输出
l.Out = src
// 设置日志格式 JSONFormatter=json TextFormatter=text
l.SetFormatter(&logrus.JSONFormatter{
TimestampFormat: "2006-01-02 15:04:05",
})
l.Println(args...)
}

@ -0,0 +1,51 @@
package dorm
import (
"context"
"errors"
"fmt"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
type ConfigMongoClient struct {
Dns string // 地址
}
type MongoClient struct {
Db *mongo.Client // 驱动
config *ConfigMongoClient // 配置
}
func NewMongoClient(config *ConfigMongoClient) (*MongoClient, error) {
c := &MongoClient{}
c.config = config
// 连接到MongoDB
db, err := mongo.Connect(context.TODO(), options.Client().ApplyURI(c.config.Dns))
if err != nil {
return nil, errors.New(fmt.Sprintf("连接失败:%v", err))
}
// 检查连接
err = db.Ping(context.TODO(), nil)
if err != nil {
return nil, errors.New(fmt.Sprintf("检查连接失败:%v", err))
}
return c, nil
}
func (c *MongoClient) GetDb() *mongo.Client {
return c.Db
}
// Close 关闭
func (c *MongoClient) Close() error {
err := c.Db.Disconnect(context.TODO())
if err != nil {
return errors.New(fmt.Sprintf("关闭失败:%v", err))
}
return nil
}

@ -0,0 +1,51 @@
package dorm
import (
"context"
"errors"
"fmt"
"github.com/go-redis/redis/v8"
"time"
)
type ConfigRedisClient struct {
Addr string // 地址
Password string // 密码
DB int // 数据库
PoolSize int // 连接池大小
}
type RedisClient struct {
Db *redis.Client // 驱动
config *ConfigRedisClient // 配置
}
func NewRedisClient(config *ConfigRedisClient) (*RedisClient, error) {
c := &RedisClient{}
c.config = config
if c.config.PoolSize == 0 {
c.config.PoolSize = 100
}
c.Db = redis.NewClient(&redis.Options{
Addr: c.config.Addr, // 地址
Password: c.config.Password, // 密码
DB: c.config.DB, // 数据库
PoolSize: c.config.PoolSize, // 连接池大小
})
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
_, err := c.Db.Ping(ctx).Result()
if err != nil {
return nil, errors.New(fmt.Sprintf("连接失败:%v", err))
}
return c, nil
}
func (c *RedisClient) GetDb() *redis.Client {
return c.Db
}

@ -1,4 +1,4 @@
package goredis
package dorm
type Iterator struct {
data []interface{}

@ -1,4 +1,4 @@
package goredis
package dorm
import (
"context"

@ -1,4 +1,4 @@
package goredis
package dorm
import (
"context"
@ -11,8 +11,8 @@ type ListOperation struct {
}
// NewListOperation 列表(list)类型数据操作 https://www.tizi365.com/archives/299.html
func (app *App) NewListOperation() *ListOperation {
return &ListOperation{db: app.Db, ctx: context.Background()}
func (c *RedisClient) NewListOperation() *ListOperation {
return &ListOperation{db: c.Db, ctx: context.Background()}
}
// LPush 从列表左边插入数据

@ -1,4 +1,4 @@
package goredis
package dorm
import "time"

@ -1,4 +1,4 @@
package goredis
package dorm
import (
"encoding/json"
@ -24,7 +24,7 @@ type SimpleCache struct {
}
// NewSimpleCache 构造函数
func (app *App) NewSimpleCache(operation *StringOperation, expire time.Duration, serializer string) *SimpleCache {
func (c *RedisClient) NewSimpleCache(operation *StringOperation, expire time.Duration, serializer string) *SimpleCache {
return &SimpleCache{
Operation: operation, // 操作类
Expire: expire, // 过去时间

@ -1,4 +1,4 @@
package goredis
package dorm
import (
"log"
@ -15,7 +15,7 @@ type SimpleInterfaceCache struct {
}
// NewSimpleInterfaceCache 构造函数
func (app *App) NewSimpleInterfaceCache(operation *SimpleOperation, expire time.Duration) *SimpleInterfaceCache {
func (c *RedisClient) NewSimpleInterfaceCache(operation *SimpleOperation, expire time.Duration) *SimpleInterfaceCache {
return &SimpleInterfaceCache{
Operation: operation, // 操作类
Expire: expire, // 过期时间

@ -1,4 +1,4 @@
package goredis
package dorm
import (
"encoding/json"
@ -15,7 +15,7 @@ type SimpleJsonCache struct {
}
// NewSimpleJsonCache 构造函数
func (app *App) NewSimpleJsonCache(operation *StringOperation, expire time.Duration) *SimpleJsonCache {
func (c *RedisClient) NewSimpleJsonCache(operation *StringOperation, expire time.Duration) *SimpleJsonCache {
return &SimpleJsonCache{
Operation: operation, // 操作类
Expire: expire, // 过期时间

@ -1,4 +1,4 @@
package goredis
package dorm
import (
"context"
@ -11,9 +11,9 @@ type SimpleOperation struct {
ctx context.Context
}
func (app *App) NewSimpleOperation() *SimpleOperation {
func (c *RedisClient) NewSimpleOperation() *SimpleOperation {
return &SimpleOperation{
db: app.Db,
db: c.Db,
ctx: context.Background(),
}
}

@ -1,4 +1,4 @@
package goredis
package dorm
type SimpleResult struct {
Result interface{}

@ -1,4 +1,4 @@
package goredis
package dorm
import (
"time"
@ -14,7 +14,7 @@ type SimpleStringCache struct {
}
// NewSimpleStringCache 构造函数
func (app *App) NewSimpleStringCache(operation *StringOperation, expire time.Duration) *SimpleStringCache {
func (c *RedisClient) NewSimpleStringCache(operation *StringOperation, expire time.Duration) *SimpleStringCache {
return &SimpleStringCache{
Operation: operation, // 操作类
Expire: expire, // 过期时间

@ -1,4 +1,4 @@
package goredis
package dorm
type SliceResult struct {
Result []interface{}

@ -1,4 +1,4 @@
package goredis
package dorm
import (
"context"
@ -11,9 +11,9 @@ type StringOperation struct {
ctx context.Context
}
func (app *App) NewStringOperation() *StringOperation {
func (c *RedisClient) NewStringOperation() *StringOperation {
return &StringOperation{
db: app.Db,
db: c.Db,
ctx: context.Background(),
}
}

@ -1,4 +1,4 @@
package goredis
package dorm
type StringResult struct {
Result string // 结果

@ -1,108 +0,0 @@
package gomysql
import (
"fmt"
"github.com/sirupsen/logrus"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"log"
"os"
"path"
"time"
)
type App struct {
Db *gorm.DB // 驱动
Dns string // 地址
Log bool // 日志
LogUrl string // 日志路径
}
type writer struct{}
// 日志路径
var logsUrl = ""
func (w writer) Printf(format string, args ...interface{}) {
// 判断路径
now := time.Now()
logFilePath := ""
if dir, err := os.Getwd(); err == nil {
logFilePath = dir + logsUrl
}
if err := os.MkdirAll(logFilePath, 0777); err != nil {
fmt.Println(err.Error())
}
logFileName := "gorm." + now.Format("2006-01-02") + ".log"
// 日志文件
fileName := path.Join(logFilePath, logFileName)
if _, err := os.Stat(fileName); err != nil {
if _, err := os.Create(fileName); err != nil {
fmt.Println(err.Error())
}
}
// 写入文件
src, err := os.OpenFile(fileName, os.O_APPEND|os.O_WRONLY, os.ModeAppend)
if err != nil {
fmt.Println("err", err)
}
// 实例化
l := logrus.New()
// 设置输出
l.Out = src
// 设置日志格式 JSONFormatter=json TextFormatter=text
l.SetFormatter(&logrus.JSONFormatter{
TimestampFormat: "2006-01-02 15:04:05",
})
l.Println(args...)
}
func (app *App) InitClient() {
log.Printf("mysql config%+v\n", app)
// 判断路径
if app.LogUrl == "" {
logsUrl = "/logs/mysql"
}
var err error
if app.Log == true {
app.Db, err = gorm.Open(mysql.Open(app.Dns), &gorm.Config{
Logger: logger.New(
writer{},
logger.Config{
SlowThreshold: time.Second, // 慢 SQL 阈值
LogLevel: logger.Info, // 日志级别
IgnoreRecordNotFoundError: true, // 忽略ErrRecordNotFound记录未找到错误
Colorful: false, // 禁用彩色打印
},
),
})
} else {
app.Db, err = gorm.Open(mysql.Open(app.Dns), &gorm.Config{})
}
if err != nil {
panic(fmt.Sprintf("数据库【mysql】连接失败%v", err))
}
sqlDB, err := app.Db.DB()
if err != nil {
panic(fmt.Sprintf("数据库【mysql】连接服务器失败%v", err))
}
sqlDB.SetMaxIdleConns(10) // 设置空闲连接池中连接的最大数量
sqlDB.SetMaxOpenConns(100) // 设置打开数据库连接的最大数量。
sqlDB.SetConnMaxLifetime(time.Second * 600) // 设置了连接可复用的最大时间。
}

@ -1,106 +0,0 @@
package gopostgres
import (
"fmt"
"github.com/sirupsen/logrus"
"gorm.io/driver/postgres"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"log"
"os"
"path"
"time"
)
type App struct {
Db *gorm.DB // 驱动
Dns string // 地址
Log bool // 日志
LogUrl string // 日志路径
}
type writer struct{}
// 日志路径
var logsUrl = ""
func (w writer) Printf(format string, args ...interface{}) {
now := time.Now()
logFilePath := ""
if dir, err := os.Getwd(); err == nil {
logFilePath = dir + logsUrl
}
if err := os.MkdirAll(logFilePath, 0777); err != nil {
fmt.Println(err.Error())
}
logFileName := "gorm." + now.Format("2006-01-02") + ".log"
// 日志文件
fileName := path.Join(logFilePath, logFileName)
if _, err := os.Stat(fileName); err != nil {
if _, err := os.Create(fileName); err != nil {
fmt.Println(err.Error())
}
}
// 写入文件
src, err := os.OpenFile(fileName, os.O_APPEND|os.O_WRONLY, os.ModeAppend)
if err != nil {
fmt.Println("err", err)
}
// 实例化
l := logrus.New()
// 设置输出
l.Out = src
// 设置日志格式 JSONFormatter=json TextFormatter=text
l.SetFormatter(&logrus.JSONFormatter{
TimestampFormat: "2006-01-02 15:04:05",
})
l.Println(args...)
}
func (app *App) InitClient() {
log.Printf("pgsql config%+v\n", app)
// 判断路径
if app.LogUrl == "" {
logsUrl = "/logs/postgresql"
}
var err error
if app.Log == true {
app.Db, err = gorm.Open(postgres.Open(app.Dns), &gorm.Config{
Logger: logger.New(
writer{},
logger.Config{
SlowThreshold: time.Second, // 慢 SQL 阈值
LogLevel: logger.Info, // 日志级别
IgnoreRecordNotFoundError: true, // 忽略ErrRecordNotFound记录未找到错误
Colorful: false, // 禁用彩色打印
},
),
})
} else {
app.Db, err = gorm.Open(postgres.Open(app.Dns), &gorm.Config{})
}
if err != nil {
panic(fmt.Sprintf("数据库【pgsql】连接失败%v", err))
}
sqlDB, err := app.Db.DB()
if err != nil {
panic(fmt.Sprintf("数据库【pgsql】连接服务器失败%v", err))
}
sqlDB.SetMaxIdleConns(10) // 设置空闲连接池中连接的最大数量
sqlDB.SetMaxOpenConns(100) // 设置打开数据库连接的最大数量。
sqlDB.SetConnMaxLifetime(time.Second * 600) // 设置了连接可复用的最大时间。
}

@ -1,45 +0,0 @@
package goredis
import (
"context"
"errors"
"fmt"
"github.com/go-redis/redis/v8"
"log"
"time"
)
// App 实例
type App struct {
Db *redis.Client
Addr string // 地址
Password string // 密码
DB int // 数据库
PoolSize int // 连接池大小
}
// InitClient 初始化连接
func (app *App) InitClient() {
log.Printf("redis config%+v\n", app)
if app.PoolSize == 0 {
app.PoolSize = 100
}
app.Db = redis.NewClient(&redis.Options{
Addr: app.Addr, // 地址
Password: app.Password, // 密码
DB: app.DB, // 数据库
PoolSize: app.PoolSize, // 连接池大小
})
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
_, err := app.Db.Ping(ctx).Result()
if err != nil {
panic(errors.New(fmt.Sprintf("数据库【redis】连接失败%v", err)))
}
return
}
Loading…
Cancel
Save