GORM介绍
- GORM是go语言流行的ORM框架
- GORM支持的数据库:MySql、SQLServer、PostgreSQL、SQLite,通过驱动来连接数据库
- 按照规范来使用GORM,可以天然地防sql注入
ORM (对象关系映射)框架是一种将数据库和对象之间进行映射的技术。 它将数据库表的结构和数据映射到对象模型中,使开发人员可以使用面向对象的方式来操作数据库,而不需要直接编写SQL查询语句。
GORM的使用
GORM连接数据库
- DSN 是 "Data Source Name" 的缩写,它是一种连接数据库或其他数据源的格式化字符串。DSN 包含了连接数据库所需的一些信息,如数据库的地址、用户名、密码、端口号等用于标识要连接的数据库
&gorm.Config{}可以配置数据库连接的一些选项
GORM创建数据库表
type User struct {
Id int64 `json:"id" gorm:"column:id"`
Name string `json:"name" gorm:"column:name"`
Password string `json:"-" gorm:"column:password"`
Avatar string `json:"avatar" gorm:"column:avatar"`
BackgroundImage string `json:"background_image" gorm:"column:background_image"`
Signature string `json:"signature" gorm:"column:signature"`
FollowCount int64 `json:"follow_count" gorm:"default:0"`
FollowerCount int64 `json:"follower_count" gorm:"default:0"`
IsFollow bool `json:"is_follow" gorm:"-"`
TotalFavorited string `json:"total_favorited" gorm:"default:0"`
WorkCount int64 `json:"work_count" gorm:"default:0"`
FavoriteCount int64 `json:"favorite_count" gorm:"default:0"`
}
gorm.DB.AutoMigrate(&User{})
- GORM可以通过结构体自动创建相应的数据库表,只需定义好相应的结构体,使用gorm.DB.AutoMigrate()加载该结构体即可
- 通过
gorm标签可以配置数据库表字段的一些属性 gorm.Model是 GORM 提供的一个内嵌结构体,用于为模型结构体(即数据库表的映射结构)添加一些常用的字段,以及内置的一些 CRUD 方法。包含ID,CreatedAt,UpdatedAt,DeletedAt
GORM创建数据
user := &User{}
db.Create(user)
user.ID // 返回插入数据的主键
result.Error // 返回 error
result.RowsAffected // 返回插入记录的条数
- 使用create来创建记录
- 可以使用
Create()创建多项记录(传入结构体数组) - 可以在结构体定义时使用
`gorm: default :XXX`标签来为记录字段定义默认值
GORM查询数据
// 获取第一条记录(主键升序)
db.First(&user)
// SELECT * FROM users ORDER BY id LIMIT 1;
// 获取一条记录,没有指定排序字段
db.Take(&user)
// SELECT * FROM users LIMIT 1;
// 获取最后一条记录(主键降序)
db.Last(&user)
// SELECT * FROM users ORDER BY id DESC LIMIT 1;
result := db.First(&user)
result.RowsAffected // 返回找到的记录数
result.Error // returns error or nil
// 检查 ErrRecordNotFound 错误
errors.Is(result.Error, gorm.ErrRecordNotFound)
- 使用First查询,需要注意查询不到数据会返回ErrRecordNotFound
- 使用Find查询,可以查询多条数据,查询不到数据返回空数组
- 当使用结构体作为查询条件时,GORM会忽略零值字段
GORM更新数据
// Update with conditions
db.Model(&User{}).Where("active = ?", true).Update("name", "hello")
// UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE active=true;
// User's ID is `111`:
db.Model(&user).Update("name", "hello")
// UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE id=111;
// Update with conditions and model
value db.Model(&user).Where("active = ?", true).Update("name", "hello")
// UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE id=111 AND active=true;
- Model(&user):找到对应数据库的表名
- 使用Struct 更新时,只会更新非零值,如果需要更新零值可以使用Map更新或使用Select 选择字段。
GORM删除数据
// Email 的 ID 是 `10`
db.Delete(&email)
// DELETE from emails where id = 10;
// 带额外条件的删除
db.Where("name = ?", "jinzhu").Delete(&email)
// DELETE from emails where id = 10 AND name = "jinzhu";
- 如果模型包含了
gorm.DeletedAt字段(该字段也被包含在gorm.Model中),那么该模型将会自动获得软删除的能力,当调用Delete时,GORM并不会从数据库中删除该记录,而是将该记录的DeleteAt设置为当前时间,而后的一般查询方法将无法查找到此条记录。 - 如果并不想嵌套
gorm.Model,也可以像这样开启软删除特性:Deleted `gorm.DeletedAt`
GORM事务
- 容易漏写Rollback和Commit