gorm是一个基于Golang实现的sql框架
https://gorm.io/

1.简介与使用

orm是指对象关系映射(Object Relational Mapping)
https://gorm.io/zh_CN/docs/connecting_to_the_database.html

  1. func main() {
  2. // 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
  3. dsn := fmt.Sprintf("%s:%s@tcp(%s)/%scharset=utf8mb4&parseTime=True&loc=Local",
  4. userName,//rzy
  5. passWord,//abc123456
  6. host,//127.0.0.1:3306
  7. name)//UserDb
  8. db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
  9. // gorm.Config可以配置log,connPoll等
  10. }

2.具体使用方法及部分源码

大部分使用gorm的官方文档已经写的非常清楚了,下面只记录几个自己遇到的容易踩坑的点
1.gorm在没有查到记录时一般会返回一个error:RecordNotFound,但是当我们使用Find()方法时
如果寻找一个slice,gorm不会返回error,而是返回一个空的slice

2.gorm是如何寻找表的
1).约定struct的名字就是表名
GORM 使用结构体名的驼峰作为表名,例如下面这个表,gorm默认为user_info

  1. type UserInfo struct{
  2. Id int `gorm:"primaryKey" json:"id"`
  3. //gorm会默认将id设置为主键,也可以通过tag配置
  4. Name string `json:"name"`
  5. }

2).使用db.Table()方法来指定表(推荐)

  1. var deletedUsers []User
  2. db.Table("deleted_users").Find(&deletedUsers)
  3. // SELECT * FROM deleted_users;

3).继承Table的接口,可以定义表名

  1. type Tabler interface {
  2. TableName() string
  3. }
  4. // TableName 会将 user_info 的表名重写为 `profiles`
  5. func (User) TableName() string {
  6. return "profiles"
  7. }

3.GORM 允许用户定义的钩子有
具体有

  1. func (user *UserInfo) BeforeCreate(tx *gorm.DB)(err error)
  2. func (user *UserInfo) AfterCreate(tx *gorm.DB)(err error)
  3. func (user *UserInfo) BeforeUpdate(tx *gorm.DB)(err error)
  4. func (user *UserInfo) AfterUpdate(tx *gorm.DB)(err error)
  5. func (user *UserInfo) BeforeDelete(tx *gorm.DB)(err error)
  6. func (user *UserInfo) AfterDelete(tx *gorm.DB)(err error)

4.在使用联表查询或者只查询部分字段的时候,打tag的时候要在后面加上column标签

  1. type Model struct{
  2. UserId int `gorm:"column:user_id" json:"user_id"`
  3. UserName int `gorm:"column:user_name" json:"user_name"`
  4. }