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,//rzypassWord,//abc123456host,//127.0.0.1:3306name)//UserDbdb, 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 []Userdb.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"`}
