Golang Go语言中想知道的 orm 框架如何映射结构体到表?
Golang Go语言中想知道的 orm 框架如何映射结构体到表?
通过结构体名去映射每个表的话,难道是有一个"注册"结构体的操作?不然的话是怎么找到项目中与表名对应的结构体的?
package model
import (
"github.com/jinzhu/gorm"
)
type ExaFileUploadAndDownload struct {
gorm.Model
Name string `json:"name" gorm:"comment:'文件名'"`
Url string `json:"url" gorm:"comment:'文件地址'"`
Tag string `json:"tag" gorm:"comment:'文件标签'"`
Key string `json:"key" gorm:"comment:'编号'"`
}
}
更多关于Golang Go语言中想知道的 orm 框架如何映射结构体到表?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
gorm:“comment:‘文件名’” 就是这个起作用, 用反射获取 tag 的内容。然后一一对应
更多关于Golang Go语言中想知道的 orm 框架如何映射结构体到表?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
可以给结构体写个 TableName()方法返回对应的表名,如果未定义该方法,框架可以使用默认映射策略,如:ExaFileUploadAndDownload -> exa_file_upload_and_download
很多玩法,可以注册用反射解决,可以生成代码解决,也可以直接不解决,让用户 new 出来当参数传进来
多了解 go 反射
reflect
反射
func (ExaFileUploadAndDownload) TableName() string {
return “表名”
}
我看代码里面写的是反射方式
在Go语言中,ORM(对象关系映射)框架通过将结构体映射到数据库表,简化了数据库操作。以下是一些常见的Go ORM框架(如GORM、XORM等)如何映射结构体到表的概述:
-
结构体标签:ORM框架通常使用结构体标签(struct tags)来定义映射关系。例如,在GORM中,你可以通过
gorm:"column:db_column_name"
标签来指定结构体字段对应数据库表的列名。type User struct { ID uint `gorm:"primaryKey"` Name string `gorm:"column:username"` Email string `gorm:"uniqueIndex"` Age int }
-
约定优于配置:许多ORM框架遵循约定优于配置的原则。例如,GORM默认会将结构体名称的蛇形转换作为表名,并将结构体字段名作为列名。
-
全局配置:你可以在初始化ORM时设置一些全局配置,如数据库连接信息、表前缀等。这些配置会影响所有映射到数据库的结构体。
-
迁移:ORM框架通常提供迁移功能,可以自动或手动地根据结构体的定义创建或更新数据库表结构。
-
高级映射:对于复杂的映射关系,如一对一、一对多、多对多等,ORM框架通常提供额外的配置和接口来实现这些关系。
总之,Go语言的ORM框架通过结构体标签、约定优于配置、全局配置、迁移和高级映射等机制,将结构体映射到数据库表,从而简化了数据库操作。