共计 2370 个字符,预计需要花费 6 分钟才能阅读完成。
gin-vue-admin 是一个很好用的快速脚手工具,使用自动化代码生成器生成的代码默认在当前 gva 的数据库下面。如果我们想用 gva 来管理我们的别的数据库应该怎么做那?
这个时候就需要使用 gva 强大的多数据库支持功能了。
gva 官方文档关于多数据库支持的描述
这里假设我们需要使用 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())
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”
加入后重启,问题解决!