数据库
数据库配置
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)
}