Gorm、KiteX、Hertz框架(1) | 青训营笔记

113 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天

由于这部分的内容量比较大而且,需要实操的地方也比较多。这里就分篇写了。(要过年了,没啥时间。)

Gorm

Gorm是一个ORM(Object Relational Mapping)框架。简单点将就是与数据进行交互的框架。类似于pymysql与QT的sqldirve。通过使用这个框架,我们可以与数据库建立连接,从而进行数据库的增删改查的操作。如果你之前写过和数据库交互的项目的话,这个框架学起来还是较为轻松的。很多地方都是相通的。

目前,gorm支持以下数据库:MySQL, PostgreSQL, SQlite, SQL Server。如果还有其他的数据库需求的话,可以自己开发或者复用已经存在的数据库驱动。

以下是一个数据库连接的实例:

package main

import (
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

func main() {
	dsn := "root:root123@tcp(127.0.0.1:3306)/test_gorm?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic(err)
	}
}

gorm的open函数用于从打开的数据通道中建立一个gorm连接。而在我们建立与数据库的数据通道中,我们使用到了dsn这个玩意。其实就是数据源名称。这个dsn标识了一个数据源以及连接参数等等。随后,gorm就可以通过这个连接来访问数据库了。

这里我们的错误处理其实也处理了mysqldirver中的错误。毕竟go中的error和其他语言的exception是不一样的。当mysql open失败的时候,返回将是nil,而将gorm作用到nil就会返回错误了。自然而然我们也能直到在open阶段出现了错误。

下面我们来进行表操作:

cpp中的数据库交互我写的比较少,这里还是和python作比较吧。在python中,我们会使用一个类来表示一个表结构。而在这里,也是相同的。

我们创建一个结构体,写上我们的字段:

type User struct { 
    Id int 
    Name string 
    Age int 
    Addr string 
    Pic string 
}

func (u User) TableName() string {
    return "User"
}

此时,我们的表结构就创建好了。我们这个User表有五个字段,分别是ID,姓名,年龄,地址与头像(这里用的string)。在gorm中,ID这个名称是默认为主键的。

同时我们还定义了一个类成员函数,这个实际上是一个接口的实现。使得gorm能取得这个对象所指向的表的名称。如果不提供的话,那么tablename就会默认返回为类的蛇形命名法。

	db.Create(&User{
		Name: "张三",
		Age:  18,
		Addr: "北京市",
		Pic:  "/static/img.png",
	})

	var user User
	db.First(&user)

	user.Name = "lisi"
	db.Save(&user)

	db.Delete(&user)
}

gorm给我们提供了增删改查的方法。注意看我们的create函数传入的是一个指针,这是因为create函数会对对象进行回写。例如我们的ID字段。我们在提供的数据中并没有提供,而这个字段一般来说是数据库自增主键。也就是我们也不知道这个是什么。所以create的时候,gorm会把插入的数据重新的写回到这个对象中,所以需要提供一个指针。否则会出错。当然,我们的默认字段其实还不止ID,例如我们的每条数据其实都会带上CreateAt,UpdateAt这两个字段。标识了这条数据是什么时候创建且最后一次更新是什么时候。

当然create函数也支持多个创建。传入切片即可。

db.First(&user, "Id = ?", 123)

在First函数中如果我们需要条件可以如上方提供的语句进行使用。'?'是占位符,绑定到后方提供的参数中。

或者,我们使用Where函数来指定我们的查询条件:

db.Where("name in ?", []string{"lihua", "shangming"}).Find(&user)

这个Where返回的还是一个gorm对象,所以可以进行链式调用。也挺直观的。当然更加详细的实例这里就不说了。看文档即可。