警告:当删除一条记录的时候,你需要确定这条记录的主键有值,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;
}