ORM(Object Relational Mapping), 通常用来描述编程语言与数据库交互的框架,例如比较出名的有Java语言的Mybatis.
Gorm是go语言的一种orm框架,不过相比之下它看起来要接近原生的JDBC写法。不过这也给我们提供了更多的灵活性。
下面从一个简单的示例开始(来着Gorm官方文档)
第一件事是安装gorm:
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql # 如果使用MySQL作为数据库
接下来是使用:
type Product struct {
gorm.Model
Code string
Price uint
}
func main() {
db, err := gorm.Open("user:pass@tcp(127.0.0.1:3306)/dbname", &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
db.Create(&Product{Code: "D42", Price: 100})
var product Product
db.First(&product, 1) // 根据整型主键查找
db.First(&product, "code = ?", "D42") // 查找 code 字段值为 D42 的记录
// Update - 将 product 的 price 更新为 200
db.Model(&product).Update("Price", 200)
// Update - 更新多个字段
db.Model(&product).Updates(Product{Price: 200, Code: "F42"}) // 仅更新非零值字段
db.Model(&product).Updates(map[string]interface{}{"Price": 200, "Code": "F42"})
// Delete - 删除 product
db.Delete(&product, 1)
}
首先是gorm.Open()一段,这里"user:pass"是数据库的用户名和密码,"tcp(127.0.0.1:3306)" 是数据库地址和端口,"/dbname" 是连接的数据库名。gorm.Config{}是传入的配置结构体,可以用于定制 GORM的一些行为,例如是否启用日志、是否启用自动迁移等。
如果发生连接失败,就会进入if,panic出连接错误。
随后是db.Create(&Product{Code: "D42", Price: 100})。这行代码执行插入操作。它创建了一个新的 Product 记录,并将 Code 设置为 "D42" , Price 设置为 100。Create 方法将结构体对象插入数据库的 products 表(表名由结构体名称的复数形式自动推断)。
接下来是First查询方法。db.First(&product, 1)这行代码会查找Product表中ID字段(主键)值为1的记录,并将其赋值给product变量。First方法默认按主键排序,查找第一个符合条件的记录。如果没有找到匹配的记录,product会保持为零,即product.ID为0。
而db.First(&product, "code = ?", "D42")则查询了Product 表中 Code 字段等于 "D42" 的记录。这里是GORM的First方法的查询特殊写法,将第二个参数 D42作为条件值。查询返回的第一条记录将被赋值给&product 变量。
Update方法是负责更新数据的。db.Model(&product).Update("Price", 200)这行代码会将 product 对象的 Price 字段的值更新为 200。Model(&product) 表示基于 product 模型进行更新。虽然看起来只是修改了product变量,但是因为product变量之前进行了查找操作,因此这里实际也会修改数据库里对应的product。
db.Model(&product).Updates(map[string]interface{}{"Price": 200, "Code": "F42"})这行使用了一个 map[string]interface{} 来更新多个字段。map 的键是字段名,值是要更新的内容。这样也可以更新多个字段,并且对字段值的类型没有限制。如果不使用接口的话,使用struct更新只会更新非零值。
最后是删除操作。db.Delete(&product, 1)这行会删除 Product 表中主键ID为1的记录。因为product变量中存储的是一个之前查询到的对象,因此可以根据对象删除数据库里对应的记录。另外传入的第二个参数1也指定了要删除的主键ID。
最后GORM还提供了gorm.DeletedAT来软删除,类似MybatisPlus的isDelete,这里是生成一个时间戳,超过该时间戳的时间就不能查询。使用Unscoped方法可以实现查询软删除数据。