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包含了ID、CreatedAt、UpdatedAt、DeletedAt字段,
分别用于表示主键、创建时间、更新时间、删除时间
字段标签
在结构体中,可以使用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()