使用GORM连接数据库
1GORM简介
Gorm是Go语言中一款性能极好的ORM库,对开发人员相对比较友好,能够显著提升开发效率。
功能特点:
- 支持数据库自动迁移;
- 支持自定义日志;
- 可扩展性,可基于Gorm回调编写插件;
- 所有功能都被测试覆盖。
- 是一个全功能ORM(无限接近);
- 支持复合主键;
- 支持SQL生成器;
- 支持关联(Has One、Has Many、Belongs To、Many To Many、多态);
- 支持钩子函数Hook(在创建/保存/更新/删除/查找之前或之后);
- 支持预加载:
- 支持事务;
2安装
## 必须安装gorm
go get -u gorm.io/gorm
## 安装相应的数据库驱动。GORM 官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server
go get -u gorm.io/driver/mysql
此时导包
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
安装
go get -u github.com/jinzhu/gorm
go get -u github.com/go-sql-driver/mysql
此时导包
import (
_ "github.com/go-sql-driver/mysql"
"github.com/jinzhu/gorm"
)
3使用过程
3.1建表
使用mysql中语句建立一个表user,有id、姓名、密码
create table `users`(
`id` int(10) unsigned not null auto_increment,
`name` varchar(255) default null,
`password` varchar(255) default null,
primary key(`id`)
)engine=InnoDB auto_increment=1 default charset=utf8;
3.2定义操作数据库的模型
声明模型 模型是带有基本Go类型的普通结构,指针/别名,或者实现了Scanner和Valuer接口的自定义类型
这里使用了encoding/json包
//数据表的结构体类
type User struct {
ID uint `json:"id"`
Name string `json:"name"`
PassWord string `json:"password"`
}
其中使用约定是方便的,配置比较麻烦
GORM 更喜欢约定而不是配置,默认情况下,GORM 使用ID作为主键,将结构名称复数users作为表名,name作为列名
3.3建立数据库连接工具类
package repository
import (
_ "github.com/go-sql-driver/mysql"
"github.com/jinzhu/gorm"
"log"
)
func main() {
db, err := gorm.Open("mysql", "root:root@(127.0.0.1:3306)/mytable?"+"charset=utf8mb4&parseTime=True")
if err != nil {
log.Fatal(err)
}
defer db.Close()
db.DB().SetMaxIdleConns(10)//设置空闲连接池中的最大连接数
db.DB().SetMaxOpenConns(100)//设置与数据库的最大打开连接数
/*
操作
*/
}
3.4插入数据
Gorm中db.Save()和db.Create()方法均可插入数据。根据构造好的结构体对象,直接调用db.Save()方法就可以插入一条记录。
//创建用户,插入数据
User := model.User{
Name: "linxi",
Password: "123456",
}
//保存到数据库
db.Save(&User)
//db.Create(&User) 用于插入数据
3.5查询数据
Gorm中查询数据,先用db.Where()方法构造查询条件,再用db.Count()方法计算数量。如果要查询多条记录,则可以用db.Find(&GormUser)语句来实现。如果只需要查询一条记录,则可以用db.First(&User)语句来实现
//查询数据
var user = new(model.User)
db.Where("phone = ?", "18812345678").Find(&user1)
//db.First(&user1, "name = ?", "linxi")
fmt.Println(*user)//{1 linxi 123456}
3.6更新数据
Gorm中更新数据使用Update()方法
//更新数据
var user = new(model.User)
count := db.Model(&user).Where("name = ?", "linxi").Update("passward", "111111").RowsAffected
fmt.Println(count)//1
3.7删除数据
在Gorm中删除数据,一般先用db.Vhere()方法构造查询条件,再调用db.Delete()方法进行删除
//删除用户
var user = new(model.User)
count := db.Where("name = ?", "linxi").Delete(&user).RowsAffected
fmt.Println(count)//1
3.8事务处理
Gorm中事务的处理也很简单:用db.Begin()方法声明开启事务,用tx.Commit()方法结束事务,在异常时调用tⅸ.Rollback()方法回滚
//开启事务
tx := db.Begin()
user := model.User{
Name: "xxx",
Password: "123456",
}
if err := tx.Create(&user).Error; err != nil {
//事务回滚
tx.Rollback()
fmt.Println(err)
}
db.First(&user, "name = ?", "linxi")
fmt.Println(user)
//事务提交
tx.Commit()