什么是ORM
ORM:对象关系映射(Obeject Relational Mapping)
| 数据库 | 面向对象的编程语言 |
|---|---|
| 表(tabel) | 类(class/struct) |
| 记录(record,row) | 对象(object) |
| 字段(field,column) | 对象属性(attribute) |
ORM 框架相当于对象和数据库中间的一个桥梁,借助 ORM 可以避免写繁琐的 SQL 语言,仅仅通过操作具体的对象,就能够完成对关系型数据库的操作。总而言之,即将数据库的表与结构体进行对应
GORM
介绍
gorm是一个使用Go语言编写的ORM框架。它文档齐全,对开发者友好,支持主流数据库。
相关链接如下:
安装:go get -u github.com/jinzhu/gorm
数据库连接
这里介绍连接mysql数据库的方法(连接不哦那个的数据库都需要导入对应数据的驱动程序)
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
func main() {
db, err := gorm.Open("mysql", "user:password@(localhost)/dbname?charset=utf8mb4&parseTime=True&loc=Local")
defer db.Close()
}
GORM Model定义
在使用ORM工具时,通常我们需要在代码中定义模型(Models)与数据库中的表名和字段属性等进行映射,在GORM中模型(Models)通常是正常定义的结构体、基本的go类型或它们的指针。 同时也支持sql.Scanner及driver.Valuer接口(interfaces)。
示例:
为了方便模型定义,GORM内置了一个gorm.Model结构体。gorm.Model是一个包含了ID, CreatedAt, UpdatedAt, DeletedAt四个字段的Golang结构体。
// gorm.Model
type Model struct {
ID uint `gorm:"primary_key"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt *time.Time
}
使用自己的模型时,带上gorm.Model就会将 ID, CreatedAt, UpdatedAt, DeletedAt字段注入到User模型中,当然不带也可以自己定义
GORM-CRUD
以下db即连接数据库创建的
创建
先定义自己的模型:
type User struct {
ID int64
Name string
Age int64
}
然后创建记录
user := User{Name: "q1mi", Age: 18}
db.NewRecord(user) // 主键为空返回`true`
db.Create(&user) // 创建user
db.NewRecord(user) // 查询主键是否存在,创建`user`后返回`false`
查询
基础的sql查询语句和gorm的查询方法如下:
// Get first matched record
db.Where("name = ?", "jinzhu").First(&user)
//// SELECT * FROM users WHERE name = 'jinzhu' limit 1;
// Get all matched records
db.Where("name = ?", "jinzhu").Find(&users)
//// SELECT * FROM users WHERE name = 'jinzhu';
// IN
db.Where("name IN (?)", []string{"jinzhu", "jinzhu 2"}).Find(&users)
//// SELECT * FROM users WHERE name in ('jinzhu','jinzhu 2');
// LIKE
db.Where("name LIKE ?", "%jin%").Find(&users)
//// SELECT * FROM users WHERE name LIKE '%jin%';
更新
Save()方法可以更新对象的所有字段
db.First(&user)
user.Name = "Tom"
user.Age = 99
db.Save(&user)
Update()方法可以更新指定字段
// 更新单个属性,如果它有变化
db.Model(&user).Update("name", "hello")
//// UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE id=111;
// 使用 map 更新多个属性,只会更新其中有变化的属性
db.Model(&user).Updates(map[string]interface{}{"name": "hello", "age": 18, "active": false})
//// UPDATE users SET name='hello', age=18, active=false, updated_at='2013-11-17 21:34:10' WHERE id=111;
// 使用 struct 更新多个属性,只会更新其中有变化且为非零值的字段
// 注意:当使用 struct 更新时,GORM只会更新那些非零值的字段
db.Model(&user).Updates(User{Name: "hello", Age: 18})
//// UPDATE users SET name='hello', age=18, updated_at = '2013-11-17 21:34:10' WHERE id = 111;
删除
删除记录时,需要确保主键字段有值,GORM 会通过主键去删除记录,如果主键为空,GORM 会删除该 model 的所有记录。
// 删除现有记录
db.Delete(&email) //// DELETE from emails where id=10;
需要注意:对Delete()方法,如果model有DeleteAt字段,GORM的删除会自动使用软删除,即将该字段改为当前时间。这时想要硬删除需要使用db.Unscoped().Delete()
若需要批量删除可以使用以下方法
db.Where("email LIKE ?", "%xxx%").Delete(Email{})
//// DELETE from emails where email LIKE "%xxx%";
db.Delete(Email{}, "email LIKE ?", "%xxx%")
//// DELETE from emails where email LIKE "%jinzhu%";