简介
ORM(Object Relational Mapping)是一种将关系型数据库和面向对象编程语言之间进行映射的技术。
ORM通过将数据库表和记录映射到面向对象的类和对象上,使得开发人员可以使用面向对象编程语言来操作数据库,从而提高了开发效率和代码质量。
GORM是一个由国人使用golang开发的ORM开源库。GORM 官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server
中文文档地址:https://learnku.com/docs/gorm/v2
基本使用
下面讲一下我的实际使用情况,数据库是mysql
初始化gorm.DB
import (
"database/sql"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
sqlDb, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/test_db?charset=utf8mb4&parseTime=True&loc=Local")
if err != nil {
// 处理连接错误
}
// 初始化gorm.DB
db, err := gorm.Open(mysql.New(mysql.Config{
Conn: sqlDb,
}), &gorm.Config{})
if err != nil {
// 处理连接错误
}
表名
1、默认情况下是根据驼峰命名法来生成一个表名,比如结构体名称为UserGroup,则表名将是 user_groups(加下划线并变为复数)。
2、使用gorm的Table方法,例如
db.Table("my_table_name").Create(&UserInfo{
Name: "jaylog",
Gender: "man",
Hobby: "pingpong",
})
3、定义TableName()方法,如下
// MailsTable 邮件信息表
type MailsTable struct {
Id uint64 `gorm:"column:id"`
MailId int32 `gorm:"column:mail_id"`
Sender string `gorm:"column:sender"`
MailGroup int8 `gorm:"column:mail_group"`
Title string `gorm:"column:title"`
Content []byte `gorm:"column:content"`
LinkType int32 `gorm:"column:link_type"`
Attachment string `gorm:"column:attachment"`
LinkTo string `gorm:"column:link_to"`
IsDelete int8 `gorm:"column:is_delete"`
CreateTime string `gorm:"column:create_time"`
}
func (t *MailsTable) TableName() string {
return "Mails"
}
插入记录
插入一条记录
mail := &MailsTable{
MailId: mailId,
Sender: mailInfo.sender,
MailGroup: mailInfo.groupId,
Title: mailInfo.title,
Content: "hello",
LinkType: mailInfo.linkType,
Attachment: mailInfo.attachment,
LinkTo: mailInfo.linkTo,
CreateTime: now,
}
err = db.Create(mail).Error
if err != nil {
return err
}
批量插入
// 定义一个结构体切片
type User struct {
Name string
Age int
}
users := []User{
{Name: "Tom", Age: 20},
{Name: "Jerry", Age: 21},
{Name: "Alice", Age: 22},
// ...
}
// 将数据分批插入到数据库中
batchSize := 1000 // 每批次插入的数据量
for i := 0; i < len(users); i += batchSize {
end := i + batchSize
if end > len(users) {
end = len(users)
}
batch := users[i:end]
if err := db.CreateInBatches(batch, batchSize).Error; err != nil {
// 处理插入错误
}
}
删除
删除一封指定邮件
err := db.Where("player_guid = ? AND mail_id = ?", playerGuid, mailId).Delete(&PlayerMailsTable{}).Error
批量删除已读邮件
err := db.Where("player_guid = ? AND has_read = ? AND mail_id IN (?)", playerGuid, 1, mailList).Delete(&PlayerMailsTable{}).Error
查询
单条查询
var mailRet MailsTable
err := db.Model(&MailsTable{MailId: mailId}).Where(map[string]interface{}{"mail_id": mailId}).Take(&mailRet).Error
批量查询
var playerMailRet []PlayerMailsTable
err := db.Model(&PlayerMailsTable{PlayerGuid: playerGuid}).
Select("player_guid, mail_id, has_read, mail_title").
Where("player_guid = ? AND is_delete = 0", playerGuid).
Order("create_time DESC").
Limit(1000).
Find(&playerMailRet).
Error
更新
更新单列
err := db.Model(&PlayerMailsTable{PlayerGuid: playerGuid}).
Where("player_guid = ? AND mail_id IN (?)", playerGuid, mailList).
Update("has_read", 1).
Error
更新多列
err := db.Model(&PlayerMailsTable{}).
Where("player_guid = ? AND mail_id = ?", playerGuid, mailId).
Updates(map[string]interface{}{"is_delete": 1, "delete_time": time.Now()}).
Error