GORM的使用 | 青训营

57 阅读3分钟

gorm文档

ORM,即对象关系映射,用于将面向对象的概念和数据库中的表建立映射关系。 类似于Java中的Mybatis,Python中的Django ORM, GORM是Go语言的ORM框架,功能强大,使用简单。

安装

使用go get可以轻松安装GORM

go get -u github.com/jinzhu/gorm

连接

连接SQLServer

    import (
        "github.com/jinzhu/gorm"
        _ "github.com/jinzhu/gorm/dialects/mssql"
    )

    db, err := gorm
    .Open("mssql", "sqlserver://username:password@localhost:1433?database=dbname")
    if err != nil {
        panic("连接数据库失败")
    }
    defer db.Close()

连接池

GORM默认使用连接池,连接池的默认最大空闲连接数为10,最大连接数为100
GORM提供了大量连接池的配置选项

    db, err := gorm
    .Open("mssql", "sqlserver://username:password@localhost:1433?database=dbname")
    if err != nil {
        panic("连接数据库失败")
    }
    defer db.Close()

    // 设置最大空闲连接数
    db.DB().SetMaxIdleConns(10)
    // 设置最大连接数
    db.DB().SetMaxOpenConns(100)
    // 设置连接的最大存活时间
    db.DB().SetConnMaxLifetime(time.Hour)

模型

定义模型

Go语言中的结构体可以作为模型,字段即为表中的列

    type User struct {
        ID   int
        Name string
    }

模型映射规则

对于表名和结构体:

  • 第一个大写字母变为小写
  • 其他大写字母前加下划线
  • 复数形式

例如

  • User -> users
  • UserInfo -> user_infos

对于字段名和结构体:

  • 驼峰命名转为下划线命名
  • 大写字母转为小写

例如

  • UserName -> user_name

指定表名和字段名

在结构体中,可以用gorm:"column:xxx"来指定字段名

    type User struct {
        ID   int
        Name string `gorm:"column:username"`
    }

可以使用TableName方法指定表名

    type User struct {
        ID   int
        Name string
    }

    func (User) TableName() string {
        return "user"
    }

类似的,可以设置表的前缀

    type User struct {
        ID   int
        Name string
    }

    gorm.DefaultTableNameHandler = func(db *gorm.DB, defaultTableName string) string {
        return "prefix_" + defaultTableName
    }

gorm.Model

在结构体中可以使用gorm.Model来嵌入一些常用的字段

    type User struct {
        gorm.Model
        Name string
    }

gorm.Model包含了IDCreatedAtUpdatedAtDeletedAt字段, 分别用于表示主键、创建时间、更新时间、删除时间

字段标签

在结构体中,可以使用gorm:"xxx"来设置字段的标签
常用的标签有:

  • primary_key:设置主键
  • auto_increment:设置自增
  • unique:设置唯一
  • not null:设置非空
  • default xxx:设置默认值
  • size:x:设置字段长度
  • index:设置索引
  • unique_index:设置唯一索引 等等

模型关联

GORM支持模型之间的关联,包括一对一、一对多、多对多等关联关系

一对一

    type User struct {
        ID   int
        Name string
        Info UserInfo
    }

    type UserInfo struct {
        ID   int
        Age  int
        User User
    }

一对多

    type User struct {
        ID   int
        Name string
        Info []UserInfo
    }

    type UserInfo struct {
        ID   int
        Age  int
        User User
    }

多对多

    type User struct {
        ID   int
        Name string
        Info []UserInfo `gorm:"many2many:user_info"`
    }

    type UserInfo struct {
        ID   int
        Age  int
        User []User `gorm:"many2many:user_info"`
    }

实践

创建表

使用AutoMigrate方法可以创建表

    db.AutoMigrate(&User{})

实现增删改查

创建

    user := User{
        Name: "张三",
    }
    db.Create(&user)

查询

    var user User
    db.First(&user, 1)

更新

    db.Model(&user).Update("name", "李四")

删除

    db.Delete(&user)

查询

条件查询

    var user User
    db.Where("name = ?", "张三").First(&user)

原生SQL

    var user User
    db.Raw("select * from user where name = ?", "张三").Scan(&user)

限制查询

    var users []User
    db.Limit(10).Find(&users)

排序查询

    var users []User
    db.Order("name desc").Find(&users)

分页查询

    var users []User
    db.Offset(10).Limit(10).Find(&users)

统计查询

    var count int
    db.Model(&User{}).Count(&count)

分组查询

    var users []User
    db.Select("name, count(*) as total").Group("name").Find(&users)

联表查询

    var users []User
    db.Table("user").Select("user.name, user_info.age").Joins("left join user_info on user.id = user_info.user_id").Find(&users)

事务

    tx := db.Begin()
    tx.Create(&User{Name: "张三"})
    tx.Create(&User{Name: "李四"})
    tx.Commit()