当前位置: 首页 > 工具软件 > Go GORM > 使用案例 >

Golang之Gorm

司徒瀚
2023-12-01

Gorm 中的增删改查

  • 一个神奇的,对开发人员友好的 Golang ORM 库

警告:当删除一条记录的时候,你需要确定这条记录的主键有值,GORM会使用主键来删除这条记录。如果主键字段为空,GORM会删除模型中所有的记录。

package main

import (
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/sqlite"
)

var a = gorm.DB{}

// 首先设置一个结构体
type Product struct {
	gorm.Model
	Code string
	Price uint
}

func main() {
	// 连接 sqlite3
	DB, err := gorm.Open("sqlite3", "test.db")
	if err != nil {
		// 抛出异常
		panic("数据库连接异常")
	}
	// 打开数据库需要记得关闭
	defer DB.Close()

	// 自动检查 Product 结构是否变化,变化则进行迁移
	DB.AutoMigrate(&Product{})

	// 增加 (插入)
	DB.Create(&Product{Code: "1111", Price: 100})

	// 查找p
	var product Product

	SelectDemo(DB, product)

	UpdateDemo(DB, product)

	/*
		警告:当删除一条记录的时候,你需要确定这条记录的主键有值,GORM会使用主键来删除这条记录。如果主键字段为空,GORM会删除模型中所有的记录。
	*/
	//DeleteDemo(DB, product)

}

// 查询
func SelectDemo(DB *gorm.DB, product Product) {
	/*
		获取第一条记录,按照主键排序
		select * from products order by id limit 1
	*/
	DB.First(&product) // 查找 id  为 1 产品

	/*
		原生 SQL 查询
	*/
	DB.First(&product, "code = ?", "1111") // 找出 code 为 1111 的产品
	DB.Where("code = ?", "1111").First(&product)

	/*
		原生 SQL 插入 —— Struct & Map
	*/
	/* =======   Struct   =========
	select * from products where code = "1111" and price = 100 limit 1
	*/
	DB.Where(&Product{Code: "1111", Price: 100}).First(&product)
	/* =======   Map   =========
	select * from products where code = "1111" and price = 100
	*/
	DB.Where(map[string]interface{}{"code": "1111", "price": 100}).Find(&product)


	/*
		 获取第一条记录,不指定排序
		select * from products limit 1
	*/
	DB.Take(&product)

	/*
		获取最后一条记录,按照主键排序(升序 : ASC 降序 : DESC )
		select * from products order by id DESC limit 1
	*/
	DB.Find(&product)

	/*
		通过主键进行查询(仅适用于主键是数字类型的)
		select * from products where id = 10
	*/
	DB.First(&product, 10)

	/*
		查询:select code, price from products
	*/
	DB.Select("code, price").Find(&product)


	/* =======  Limit  =======
	Limit:指定要查询的最大记录数(分页功能)
	*/
	// select * from products limit 3
	DB.Limit(3).Find(&product)

	// 用 -1 能够取消 limit 的限制条件
	/*
		select * from products limit 10
		select * from products
	*/
	DB.Limit(10).Find(&product).Limit(-1).Find(&product)


	/*=======  Offset  =======
	Offset : 指定在开始返回记录之前要跳过的记录数(和上面的 limit 配合实现分页显示的效果)
	*/
	// select * from products OFFSET 3
	DB.Offset(3).Find(&product)
	// -1 同样可以取消 OFFSET 的限制条件
	// SELECT * FROM products OFFSET 10
	// SELECT * FROM products;
	DB.Offset(10).Find(&product).Offset(-1).Find(&product)

}

// 修改(更新)
func UpdateDemo(DB *gorm.DB, product Product) {
	product.Code = "2222"
	product.Price = 300
	/* ====== Save ======
	Save 方法在执行 SQL 更新操作时将包含所有字段,即使这些字段没有被修改
	update products set code="2222", price=300 where id = 1
	 */
	DB.Save(&product)

	/*
	更新已更改的字段 : Update  &  Updates
	 */

	// 修改 - 将产品的价格更改为 3000
	 update product set price=3000 where id = 1;
	DB.Model(&product).Update("Price", 3000)

	// 更改单个属性
	 update product set code="3333" where id=1 and price=3000;
	DB.Model(&product).Where("Price = ?", 3000).Update("code", "3333")

	// 使用 map 改变多个属性
	 update products set code="3333", price=5000 where id=1
	DB.Model(&product).Updates(map[string]interface{}{"code": "3333", "price": 5000})

	/*
	更新选中的字段 Select  & Omit
	 */
	 update users set code='4444' WHERE id=1;
	DB.Model(&product).Select("code").Updates(map[string]interface{}{"code": "4444", "price": 10000})

	 update users set price=10000 WHERE id=1;
	DB.Model(&product).Omit("code").Updates(map[string]interface{}{"code": "6666", "price": 10000})

	/* ======= 批量更新  ========
	 */
	DB.Table("products").Where("id IN (?)", []int{1, 2}).Updates(map[string]interface{}{"code": "8888"})
}

// 删除
func DeleteDemo(DB *gorm.DB, product Product)  {
	/*
	警告:当删除一条记录的时候,你需要确定这条记录的主键有值,GORM会使用主键来删除这条记录。如果主键字段为空,GORM会删除模型中所有的记录。
	 */
	// 删除一条存在的记录
	 delete from products where id = 1
	DB.Delete(&product)

	/*
	批量删除
	 */
	 DELETE from products where email LIKE "%88%";
	DB.Where("code like ?", "%88%").Delete(product)
	DB.Delete(product, "code like ?", "%88%")

	/*
	软删除
	如果模型中有 DeletedAt 字段,它将自动拥有软删除的能力!当执行删除操作时,数据并不会永久的从数据库中删除,而是将 DeletedAt 的值更新为当前时间。
	 */
	DB.Delete(&product)
	 UPDATE products SET deleted_at="2022-2-28 10:23" WHERE id = 1;
}
 类似资料: