【青训营】Go的Gorm简单实例和基本操作

本内容总结自:字节跳动青年训练营 第五届后端组

Gorm简介

Gorm是一个全功能的ORM,负责的是承接Go语言对数据库的查询

Gorm的简单实例

首先安装相应的依赖

go get -u gorm.io/gorm 
go get -u gorm.io/driver/sqlite 

然后尝试一个简单的实例

package Grom

import (
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type Product struct {
	gorm.Model
	Code  string
	Price uint
}

func main() {
	db, err := gorm.Open(mysql.Open(test.db), &gorm.Config{})
	if err != nil {
		panic("failed to connect database")
	}

	// 迁移schema
	db.AutoMigrate(&Product{})

	// 新建记录
	db.Create(&Product{Code: "D42", Price: 100})

	// 读操作
	var product Product
	db.First(&product, 1)               // 根据整形主键查找
	db.First(&product, "code=?", "D42") //查找code字段为D42的记录

	// 更新操作
	db.Model(&product).Update("Price", 200)

	// Delete操作
	db.Delete(&product, 1)
}

其中,使用gorm.Open选择打开数据库文件,注意需要指明使用的是何种数据库的驱动
接下来的CRUD操作就比较常规了,比如使用First函数寻找第一个符合查询条件的

Gorm目前支持MySql,SQLServer, PostgreSQL, SQLite,Gorm通过驱动来连接数据库。

Gorm创建数据

Gorm使用结构体定义数据,然后使用db.Create()方法将结构体的内容插入到数据库中。需要注意:结构体中的参数需要和数据库中的表的属性相一致

user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}
result := db.Create(&user) // 通过数据的指针来创建

也可以选定字段来创建

db.Select("Name", "Age", "CreatedAt").Create(&user)
// INSERT INTO `users` (`name`,`age`,`created_at`) VALUES ("jinzhu", 18, "2020-07-04 11:05:21.775") 

Gorm查询数据

1.检索单个对象

Gorm可以使用First(),Take(),Last()方法从数据库中检索单个对象,如果没有找到记录,他会返回ErrRecordNotFound错误。注意这些方法需要传入的是结构体的指针,比如

db.First(&user)
// SELECT * FROM users ORDER BY id LIMIT 1;

其中,First和Last函数会根据主键找到第一个和最后一个记录,它只在通过struct或者提供model值进行查询的时候才起作用

比如:

var user User

// 可以
DB.First(&user)
// SELECT * FROM `users` ORDER BY `users`.`id` LIMIT 1

// 可以
result := map[string]interface{}{}
DB.Model(&User{}).First(&result)
// SELECT * FROM `users` ORDER BY `users`.`id` LIMIT 1

// 不行
result := map[string]interface{}{}
DB.Table("users").First(&result)

// 但可以配合 Take 使用
result := map[string]interface{}{}
DB.Table("users").Take(&result)

2.根据主键检索

GORM允许通过内联条件指定主键来检索对象,但是只支持整形,因为string可能会导致sql注入

db.First(&user, 10)
// SELECT * FROM users WHERE id = 10;

db.First(&user, "10")
// SELECT * FROM users WHERE id = 10;

db.Find(&users, []int{1,2,3})
// SELECT * FROM users WHERE id IN (1,2,3);

3.检索对象

之前的First等只是检索一条对象,需要查询多个结果的时候可以使用Find函数

// 获取全部记录
result := db.Find(&users)
// SELECT * FROM users;

result.RowsAffected // 返回找到的记录数,相当于 `len(users)`
result.Error        // returns error
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值