From 7e7fa16441da0b45f3bcfe1b6a4cf71121d020df Mon Sep 17 00:00:00 2001 From: yanweidong Date: Sat, 20 Sep 2025 10:30:06 +0800 Subject: [PATCH] =?UTF-8?q?```=20feat(database):=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E5=88=9D=E5=A7=8B=E5=8C=96=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增 NewDatabase 函数,支持根据驱动类型初始化 MySQL 或 Postgres 数据库连接。 该函数根据传入的驱动名称自动路由到对应的数据库连接创建逻辑,并提供错误处理。 ``` --- database/new.go | 21 ++++++++++++++++++ with/cache.go | 16 ++++++++++++++ with/databases.go | 27 ++++++++++++++++++++++++ with/etcd.go | 54 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 118 insertions(+) create mode 100644 with/cache.go create mode 100644 with/databases.go create mode 100644 with/etcd.go diff --git a/database/new.go b/database/new.go index 191eae7..2884156 100644 --- a/database/new.go +++ b/database/new.go @@ -1,6 +1,9 @@ package database import ( + "fmt" + "strings" + "git.apinb.com/bsm-sdk/core/database/sql" "git.apinb.com/bsm-sdk/core/types" "git.apinb.com/bsm-sdk/core/vars" @@ -12,6 +15,24 @@ var ( MigrateTables []any ) +func NewDatabase(driver string, dsn []string, options *types.SqlOptions) (db *gorm.DB, err error) { + driver = strings.ToLower(driver) + switch driver { + case "mysql": + db, err = NewMysql(dsn, options) + case "postgres": + db, err = NewPostgres(dsn, options) + default: + return nil, fmt.Errorf("unsupported database driver: %s", driver) + } + + if err != nil { + return nil, err + } + + return db, nil +} + // NewMysql 创建MySQL数据库服务 func NewMysql(dsn []string, options *types.SqlOptions) (gormDb *gorm.DB, err error) { //set connection default val. diff --git a/with/cache.go b/with/cache.go new file mode 100644 index 0000000..73217bd --- /dev/null +++ b/with/cache.go @@ -0,0 +1,16 @@ +package with + +import ( + "git.apinb.com/bsm-sdk/core/cache/redis" + "git.apinb.com/bsm-sdk/core/print" + "git.apinb.com/bsm-sdk/core/vars" +) + +func RedisCache(cfg string, cli *redis.RedisClient) { + if cfg != "" { + cli = redis.New(cfg, vars.ServiceKey) + + // print inform. + print.Info("[BSM - %s] Cache: %s, DBIndex: %d", vars.ServiceKey, cfg, cli.DB) + } +} diff --git a/with/databases.go b/with/databases.go new file mode 100644 index 0000000..2a9c203 --- /dev/null +++ b/with/databases.go @@ -0,0 +1,27 @@ +package with + +import ( + "git.apinb.com/bsm-sdk/core/conf" + "git.apinb.com/bsm-sdk/core/database" + "git.apinb.com/bsm-sdk/core/print" + "git.apinb.com/bsm-sdk/core/types" + "git.apinb.com/bsm-sdk/core/vars" + "gorm.io/gorm" +) + +func Databases(cfg *conf.DBConf, db *gorm.DB, opts *types.SqlOptions) { + if cfg == nil || len(cfg.Source) == 0 { + panic("No Database Source Found !") + } + + // print inform. + print.Info("[BSM - %s] Databases: %v", vars.ServiceKey, cfg) + + var err error + db, err = database.NewDatabase(cfg.Driver, cfg.Source, opts) + if err != nil { + print.Error("Database Init Failed !") + panic(err) + } + return +} diff --git a/with/etcd.go b/with/etcd.go new file mode 100644 index 0000000..9ac0a87 --- /dev/null +++ b/with/etcd.go @@ -0,0 +1,54 @@ +package with + +import ( + "time" + + "git.apinb.com/bsm-sdk/core/conf" + "git.apinb.com/bsm-sdk/core/errcode" + "git.apinb.com/bsm-sdk/core/print" + "git.apinb.com/bsm-sdk/core/vars" + "go.etcd.io/etcd/client/pkg/v3/transport" + clientv3 "go.etcd.io/etcd/client/v3" +) + +func Etcd(cfg *conf.EtcdConf, cli *clientv3.Client) { + if cfg == nil || len(cfg.Endpoints) == 0 { + panic("Etcd endpoints is Empty!") + } + + etcdCfg := clientv3.Config{ + Endpoints: cfg.Endpoints, + DialTimeout: 5 * time.Second, + } + + if cfg.Passwd != nil { + etcdCfg.Username = cfg.Passwd.Account + etcdCfg.Password = cfg.Passwd.Password + + } + + if cfg.TLS != nil { + tlsInfo := transport.TLSInfo{ + TrustedCAFile: cfg.TLS.CaFile, + CertFile: cfg.TLS.CertFile, + KeyFile: cfg.TLS.KeyFile, + } + tlsConfig, err := tlsInfo.ClientConfig() + if err != nil { + print.Error(errcode.ErrEtcd.Error()) + panic(err) + } + etcdCfg.TLS = tlsConfig + } + + var err error + cli, err = clientv3.New(etcdCfg) + if err != nil { + print.Error(errcode.ErrEtcd.Error()) + panic(err) + } + + // print inform. + print.Info("[BSM - %s] Service Center: %v", vars.ServiceKey, cfg.Endpoints) + return +}