gorm是一个基于Golang实现的sql框架
https://gorm.io/
1.简介与使用
orm是指对象关系映射(Object Relational Mapping)
https://gorm.io/zh_CN/docs/connecting_to_the_database.html
func main() {
// 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
dsn := fmt.Sprintf("%s:%s@tcp(%s)/%scharset=utf8mb4&parseTime=True&loc=Local",
userName,//rzy
passWord,//abc123456
host,//127.0.0.1:3306
name)//UserDb
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
// gorm.Config可以配置log,connPoll等
}
2.具体使用方法及部分源码
大部分使用gorm的官方文档已经写的非常清楚了,下面只记录几个自己遇到的容易踩坑的点
1.gorm在没有查到记录时一般会返回一个error:RecordNotFound,但是当我们使用Find()方法时
如果寻找一个slice,gorm不会返回error,而是返回一个空的slice
2.gorm是如何寻找表的
1).约定struct的名字就是表名
GORM 使用结构体名的驼峰作为表名,例如下面这个表,gorm默认为user_info
type UserInfo struct{
Id int `gorm:"primaryKey" json:"id"`
//gorm会默认将id设置为主键,也可以通过tag配置
Name string `json:"name"`
}
2).使用db.Table()方法来指定表(推荐)
var deletedUsers []User
db.Table("deleted_users").Find(&deletedUsers)
// SELECT * FROM deleted_users;
3).继承Table的接口,可以定义表名
type Tabler interface {
TableName() string
}
// TableName 会将 user_info 的表名重写为 `profiles`
func (User) TableName() string {
return "profiles"
}
3.GORM 允许用户定义的钩子有
具体有
func (user *UserInfo) BeforeCreate(tx *gorm.DB)(err error)
func (user *UserInfo) AfterCreate(tx *gorm.DB)(err error)
func (user *UserInfo) BeforeUpdate(tx *gorm.DB)(err error)
func (user *UserInfo) AfterUpdate(tx *gorm.DB)(err error)
func (user *UserInfo) BeforeDelete(tx *gorm.DB)(err error)
func (user *UserInfo) AfterDelete(tx *gorm.DB)(err error)
4.在使用联表查询或者只查询部分字段的时候,打tag的时候要在后面加上column标签
type Model struct{
UserId int `gorm:"column:user_id" json:"user_id"`
UserName int `gorm:"column:user_name" json:"user_name"`
}