GORM使用

简介

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值