Gin-vue-admin 多数据库支持

147次阅读
没有评论

gin-vue-admin 是一个很好用的快速脚手工具,使用自动化代码生成器生成的代码默认在当前 gva 的数据库下面。如果我们想用 gva 来管理我们的别的数据库应该怎么做那?

这个时候就需要使用 gva 强大的多数据库支持功能了。

gva 官方文档关于多数据库支持的描述

https://www.gin-vue-admin.com/guide/server/multiple-databases.html#%E6%96%87%E4%BB%B6%E9%85%8D%E7%BD%AE

这里假设我们需要使用 gva 来支持另外一个数据库,首先需要在 config.yml 中配置多数据库支持

db-list:
    - type: "mysql"
      alias-name: "数据库别名"
      prefix: ""port:"3306"config:"parseTime=true"db-name:" 数据库名称 "username:" 用户名 "password:" 密码 "path:" 连接主机 "engine:""
      log-mode: ""
      max-idle-conns: 10
      max-open-conns: 100
      singular: false
      log-zap: true
      disable: false

配置之后就可以在代码中使用了。

原有代码创建逻辑

global.GVA_DB.("别名").Create(articles).Error

使用别名数据库

global.MustGetGlobalDBByDBName("别名").Create(articles).Error

这样配置之后就可以在后台操作中直接操作对应的数据库了。

当我们直接把另外一个项目的 gorm 字段代码移植过来使用时可能会存在一些错误

type Sync struct {
	gorm.Model
	ID        uint   `gorm:"primaryKey,autoIncrement"`


	CreatedAt time.Time
	UpdatedAt time.Time
	Updated   int64 `gorm:"autoUpdateTime:milli"`
	Created   int64 `gorm:"autoCreateTime"`
}

如上面这个结构体字段中包含 time 类型数据默认 gva 查询处理时会报错

sql: Scan error on column index 1, name "created_at": unsupported Scan, storing driver.Value type []uint8 into type *time.Time 

解决这个问题也很简单,这个问题的出现是因为 gorm 连接数据库时没有使用 parseTime=true 参数

在·server/initialize/gorm_mysql.go 中可以看到连接数据库的信息

// GormMysqlByConfig 初始化 Mysql 数据库用过传入配置
func GormMysqlByConfig(m config.Mysql) *gorm.DB {
	if m.Dbname == "" {return nil}
	mysqlConfig := mysql.Config{DSN:                       m.Dsn(), // DSN data source name
		DefaultStringSize:         191,     // string 类型字段的默认长度
		SkipInitializeWithVersion: false,   // 根据版本自动配置
	}
	if db, err := gorm.Open(mysql.New(mysqlConfig), internal.Gorm.Config(m.Prefix, m.Singular)); err != nil {panic(err)
	} else {db.InstanceSet("gorm:table_options", "ENGINE=InnoDB")
		sqlDB, _ := db.DB()
		sqlDB.SetMaxIdleConns(m.MaxIdleConns)
		sqlDB.SetMaxOpenConns(m.MaxOpenConns)
		return db
	}
}

数据库连接信息是由上层函数传递的 dns 决定的,这里我们可以在代码处打印 m.dns 信息,默认返回字符串类型

global.GVA_LOG.Info(m.Dsn())
Gin-vue-admin 多数据库支持

GormMysqlByConfig 函数是在 server/initialize/db_list.go 中进行初始化

func DBList() {dbMap := make(map[string]*gorm.DB)
	for _, info := range global.GVA_CONFIG.DBList {
		if info.Disable {continue}
		switch info.Type {
		case "mysql":
			dbMap[info.AliasName] = GormMysqlByConfig(config.Mysql{GeneralDB: info.GeneralDB})

Dsn 连接信息则是由 server/config/gorm_mysql.go 中 Dsn 方法决定

type Mysql struct {GeneralDB `yaml:",inline" mapstructure:",squash"`}

func (m *Mysql) Dsn() string {return m.Username + ":" + m.Password + "@tcp(" + m.Path + ":" + m.Port + ")/" + m.Dbname + "?" + m.Config
}

可以看到 Dsn 方法最后会拼接 m.config 配置信息,这个时候只需要在 config.yml 中更改 config 配置即可

db-list:
    - type: "mysql"
      alias-name: "ix"
      prefix: ""port:"3306"config:"parseTime=true"

config: “parseTime=true”

加入后重启,问题解决!

Gin-vue-admin 多数据库支持
正文完
 
ddn
版权声明:本站原创文章,由 ddn 2024-04-02发表,共计2370字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。