数据库

未匹配的标注

数据库配置

config/database.yaml 是唯一一个数据库配置的地方,默认支持mysql、redis两种数据库

扩展数据库类型

如果你需要新增一个postgresql未知的类型,那么你需要提供一个使用注解@Bean("postgresql")的提供者。

新增配置如下
connections:
  pg:
    driver: postgresql
    port: 5432
    host: 127.0.0.1
    database: home-postgresql
    username: root
    password: 123456
新增提供者

这里代码未经测试,大概是这样的

package providers

import (
    "database/sql"
    "fmt"
    "github.com/go-home-admin/home/app"
    "github.com/go-home-admin/home/bootstrap/services"
    "github.com/go-home-admin/home/bootstrap/services/logs"
    "github.com/sirupsen/logrus"
    "gorm.io/driver/postgres"
    "gorm.io/gorm"
    "time"
)

// MysqlProvider @Bean("postgresql")
type PostgresqlProvider struct {
    config *services.Config `inject:"config, database"`
    dbs    map[string]*gorm.DB
}

func (m *MysqlProvider) Init() {
    m.dbs = make(map[string]*gorm.DB)

    connections := m.config.GetKey("connections")

    for name, dataT := range connections {
        data, ok := dataT.(map[interface{}]interface{})

        if !ok {
            continue
        }
        driver := data["driver"].(string)
        if driver != "mysql" {
            continue
        }
        config := services.NewConfig(data)
        hosts := config.GetString("host", "127.0.0.1")
        port := config.GetInt("port", 3306)
        username := config.GetString("username")
        password := config.GetString("password")
        dbname := config.GetString("database")

        gConf := &gorm.Config{}
        // 调试时, 记录sql
        if app.IsDebug() {
            gConf.Logger = logs.NewDebugLog()
        }
        dsn := postgres.Open(fmt.Sprintf("host=%v user=%v password=%v dbname=%v port=%v sslmode=disable TimeZone=%v", hosts, username, password, dbname, port, timezone))
        db, err := gorm.Open(dsn, gConf)
        if err != nil {
            logrus.Error("postgres 链接错误")
            panic(err)
        }
        // https://github.com/go-sql-driver/mysql/issues/1120
        d := db.ConnPool.(*sql.DB)
        d.SetConnMaxIdleTime(60 * time.Second)
        m.dbs[name.(string)] = db
    }
}

func (m *MysqlProvider) GetBean(alias string) interface{} {
    return m.dbs[alias]
}

使用新的数据库

// @Bean
type Play struct {
    DB *gorm.DB `inject:"database, pg"`
}
// 获取任意数据
func DB(aliasName string) *gorm.DB {
    return providers.NewDatabaseProvider().GetBean(aliasName).(*gorm.DB)
}

项目地址 通用工具

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 查看所有版本


暂无话题~