这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
一:gorm简介:
gorm是go语言中操作数据库的一个框架,在当今的go的编写中占据主要地位。Golang写的,GitHub上活跃度很高的orm库,比较推荐在开发中进行使用。
二:gorm连接:
连接数据库(grom2.0),首先终端中输入如下代码,导入gorm库,以下MySQL为例
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
接着在程序中配置gorm
var db *gorm.DB
func init() {
//init函数是在main函数运行前运行的函数
//grom 2。0 之后的连接方式
dsn := "root:123456@tcp(127.0.0.1:3306)/gin?charset=utf8&parseTime=True&loc=Local"
b, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
return
}
db = b
}
由于我们在项目开发中,要不断对数据库进行操作,因此我们首先定义一个全局变量db,之后gorm的函数Open()得到的直接赋予db便于之后的使用。
三:gorm的CRUD:
1、增加
①.最基本的创建方法
定义一个实体对象,然后调用creat() 函数将该对象的地址传进去
var user = User{
Model: gorm.Model{},
Name: "lizi",
Age: 20,
Birthday: time.Now(),
}
func insert1() {
result := db.Create(&user)
id := user.ID
fmt.Println("id= ", id)
row := create.RowsAffected
fmt.Println("row=", row) //row= 1
}
user.ID // 返回插入数据的主键
result.Error // 返回 error
result.RowsAffected // 返回插入记录的条数
②.选定指定列插入
定义一个实体对象,然后调用select().creat() 函数将要插入的列名传入(注意要跟你结构体的名字相同,不要看数据库的名字)
var user = User{
Model: gorm.Model{},
Name: "lizi",
Age: 20,
Birthday: time.Now(),
}
func insert2() {
//选择指定列插入
db.Select("Name", "Age", "CreatedAt").Create(&user)
}
③.一次插入多个(grom2.0的新特性)
创建一个切片,之后将该切片地址通过调用Creat() 函数插入数据库中去
func insert3() {
var users = []User{
{Name: "test01", Birthday: time.Now()},
{Name: "test02", Birthday: time.Now()},
{Name: "test03", Birthday: time.Now()},
}
db.Create(&users)
}
④.插入map对象
func insert4() {
db.Model(&User{}).Create(map[string]interface{}{
"Name": "zhuzhu",
"Age": 18,
"Birthday": time.Now(),
})
}
2.删除
①.软删除
go语言中的删除并不是真的删除,他是在delete_id的字段上删除,是软删除
加入条件删除
func delete1() {
var user User
db.Where("name=?", "lizi").Delete(&user)
fmt.Println(user)
}
根据主键删除
func del2() {
db.Delete(&User{}, 8)
}
②.真正意义上的删除(Unscoped() )
func del3() {
db.Unscoped().Delete(&User{}, 6)
}
3.更新
①.拿到对象后整体更新,在保存
db.First(&user)
user.Name = "jinzhu 2"
user.Age = 100
db.Save(&user)
②.直接更新
更新一列
Update("name", "hello") 第一个参数是更新字段名,第二个参数是更新内容
func up1() {
db.Model(&User{}).Where("name=?", "test02").Update("age", 20)
}
更新多列
Updates() 里面传入的是interface{}类型
func up2() {
db.Model(&User{}).Where("name=?", "test02").Updates(User{Name: "lizizi", Age: 99})
}
4.查询
①.First 和 Last
分别对应查询第一个和最后一个
// 获取第一条记录(主键升序)
db.First(&user)
// SELECT * FROM users ORDER BY id LIMIT 1;
// 获取一条记录,没有指定排序字段
db.Take(&user)
// SELECT * FROM users LIMIT 1;
// 获取最后一条记录(主键降序)
db.Last(&user)
// SELECT * FROM users ORDER BY id DESC LIMIT 1
②.Find (主要)
获取对象所有信息
这个获取该数据库的一行所有信息
func find3() {
//查询所有名字为test01的对象
var users []User
db.Where("name=?", "test01").Find(&users)
for _, user := range users {
fmt.Println(user)
fmt.Println("****************")
}
}
获取对象指定信息
首先要新建一个结构体对象,包含你要获取的信息,类似java API
type User struct {
gorm.Model
Name string `json:"name" gorm:"size:255"`
Age int `json:"age" gorm:"size:255"`
Birthday time.Time `json:"birthday" gorm:"size:255"`
}
type APIUser struct {
Name string `json:"name" gorm:"size:255"`
Age int `json:"age" gorm:"size:255"`
Birthday time.Time `json:"birthday" gorm:"size:255"`
}
func find4() {
var apiuser APIUser
db.Model(&User{}).Find(&apiuser)
fmt.Println(apiuser)
}