1、 Gorm简介
Gorm是Go语言中一款性能极好的ORM库,对开发人员相对比较友好,能够显著提升开发效率。
Gorm有如下功能特点:
- 是一个全功能ORM(无限接近);
- 支持关联(Has One、Has Many、Belongs To、Many To Many、多态);
- 支持钩子函数Hook(在创建/保存/更新/删除/查找之前或之后);
- 支持预加载:
- 支持事务;
- 支持复合主键;
- 支持SQL生成器;
- 支持数据库自动迁移;
- 支持自定义日志;
- 可扩展性,可基于Gorm回调编写插件;
- 所有功能都被测试覆盖。
2、Gorm的安装
go get -u github.com/jinzhu/gorm
这里还需要下载一个文件,inflection(若只下载gorm安装过程中会提示缺少inflection这个文件夹)。
https://github.com/jinzhu/inflection
3、Gorm的使用
3.1、数据库连接
import (
_ "github.com/go-sql-driver/mysql"
"github.com/jinzhu/gorm"
"log"
)
func main() {
db, err := gorm.Open("mysql", "root:123456@(127.0.0.1:3306)/chapter05?"+"charset=utf8mb4&parseTime=True&loc=Local")
if err != nil {
log.Fatal(err)
}
defer db.Close()
db.DB().SetMaxIdleConns(10)//设置空闲连接池中的最大连接数
db.DB().SetMaxOpenConns(100)//设置与数据库的最大打开连接数
}
3.2、创建表
create table `gorm_users`(
`id` int(10) unsigned not null auto_increment,
`phone` varchar(255) default null,
`name` varchar(255) default null,
`password` varchar(255) default null,
primary key(`id`)
)engine=InnoDB auto_increment=1 default charset=utf8;
3.3、定义结构体
//数据表的结构体类
type GormUser struct {
ID uint `json:"id"`
Phone string `json:"phone"`
Name string `json:"name"`
Password string `json:"password"`
}
3.4、 插入数据
Gorm中db.Save()和db.Create()方法均可插入数据。根据构造好的结构体对象,直接调用db.Save()方法就可以插入一条记录。示例代码如下:
//创建用户,插入数据
GormUser := model.GormUser{
Phone: "18812345678",
Name: "Shirdon",
Password: "666666",
}
//保存到数据库
db.Save(&GormUser)
//db.Create(&GormUser) 用于插入数据
3.5、删除数据
在Gorm中删除数据,一般先用db.Vhere()方法构造查询条件,再调用db.Delete()方法进行删除。示例代码如下:
//删除用户
var user = new(model.GormUser)
affected := db.Where("phone = ?", "18812345678").Delete(&user).RowsAffected
fmt.Println(affected)//1
3.6、查询数据
在Gorm中查询数据,先用db.Where()方法构造查询条件,再用db.Count()方法计算数量。如果要查询多条记录,则可以用db.Find(&GormUser)语句来实现。如果只需要查询一条记录,则可以用db.First(&GormUser)语句来实现。示例代码如下:
//查询数据
var user1 = new(model.GormUser)
db.Where("phone = ?", "18812345678").Find(&user1)
//db.First(&user1, "phone = ?", "18812345678")
fmt.Println(*user1)//{2 18812345678 Shirdon 666666}
3.7、 更新数据
Gorm中更新数据使用Update()方法。其示例代码如下:
//更新数据
var user2 = new(model.GormUser)
n := db.Model(&user2).Where("phone = ?", "18812345678").Update("phone", "11122223333").RowsAffected
fmt.Println(n)//1
3.8、 错误处理
在Gorm中,调用db.Error()方法就能获取到错误信息,非常方便。其示例代码如下:
//错误处理
var user3 = new(model.GormUser)
err = db.Model(&user3).Where("phone = ?", "11122223333").
Update("phone", "11122224444").Error
if err != nil {
log.Println(err)
}
3.9、事务处理
Gorm中事务的处理也很简单:用db.Begin()方法声明开启事务,用tx.Commit()方法结束事务,在异常时调用tⅸ.Rollback()方法回滚。事务处理的示例代码如下:
//开启事务
tx := db.Begin()
user4 := model.GormUser{
Phone: "123",
Name: "tom",
Password: "sss",
}
if err := tx.Create(&user4).Error; err != nil {
//事务回滚
tx.Rollback()
fmt.Println(err)
}
db.First(&user4, "phone = ?", "11122224444")
fmt.Println(user4)
//事务提交
tx.Commit()
10、日志处理
Gorm中还可以使用如下方式设置日志输出级别,一级改变日志的输出地方:
//日志处理
db.LogMode(true)
db.SetLogger(log.New(os.Stdout, "\r\n", 0))