核心引擎 · Engine引擎
Engine引擎
Session 负责与数据库的交互,那交互前的准备工作(比如连接/测试数据库),交互后的收尾工作(关闭连接)等就交给 Engine 来负责了。Engine 是 GeeORM 与用户交互的入口。代码位于根目录的 engine.go
现在的代码结构为:
1 | mygorm/ |
下面是engine引擎具体代码
-
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54package mygorm
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
"github.com/scott-pb/mygorm/log"
"github.com/scott-pb/mygorm/session"
)
// Engine 是一个数据库引擎,包含一个数据库连接。
type Engine struct {
db *sql.DB
}
// NewEngine 创建并返回一个新的 Engine 实例,接受数据库驱动名称和数据源字符串作为参数。
func (e *Engine) NewEngine(driver, source string) (*Engine, error) {
// 使用给定的驱动名称和数据源字符串打开数据库连接。
db, err := sql.Open(driver, source)
if err != nil {
log.Error(err)
return nil, err
}
// 确保连接成功。
if err = db.Ping(); err != nil {
log.Error(err)
return nil, err
}
// 打印连接成功信息。
log.Info("connect database success")
// 返回一个新的 Engine 实例。
return &Engine{
db: db,
}, nil
}
// GetSession 返回一个新的会话,该会话绑定到当前引擎的数据库连接。
func (e *Engine) GetSession() *session.Session {
return session.New(e.db)
}
// Close 关闭当前引擎的数据库连接。
func (e *Engine) Close() {
// 关闭数据库连接,并处理可能发生的错误。
if err := e.db.Close(); err != nil {
log.Error("close database failed", err)
return
}
// 打印关闭成功信息。
log.Info("close database success")
} Engine 结构体代表了数据库引擎,包含一个指向数据库连接的指针。
NewEngine 方法是一个工厂方法,用于创建并返回一个新的 Engine 实例,接受数据库驱动名称和数据源字符串作为参数。它通过给定的驱动名称和数据源字符串打开数据库连接,并确保连接成功。
GetSession 方法返回一个新的会话,该会话绑定到当前引擎的数据库连接。这个方法调用了 session.New 函数来创建会话对象。
Close 方法关闭当前引擎的数据库连接。如果关闭过程中发生错误,它会打印错误信息。
测试
新建测试文件 engine_test.go
- my-gorm/engine_test.go这是测试 MyGORM 库的数据库引擎功能。在测试函数中,首先创建了一个数据库引擎实例,并连接到 MySQL 数据库。然后获取一个数据库会话,并执行一条 SQL 查询,将查询结果中的第一行数据扫描到一个名为 User 的结构体中。最后输出查询到的用户信息。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36package mygorm
import (
"github.com/scott-pb/mygorm/log"
"testing"
)
func TestEngine(t *testing.T) {
// 创建一个新的数据库引擎实例
engine, _ := NewEngine("mysql", "root:123456@tcp(127.0.0.1:3306)/my-gorm")
// 延迟关闭数据库引擎连接
defer engine.Close()
// 获取一个数据库会话
s := engine.GetSession()
// 执行一条 SQL 查询,并获取结果的单行数据
result := s.Raw("select * from mg_user").QueryRow()
// 定义一个 User 结构体,用于存储从数据库查询结果中获取的用户信息
type User struct {
id uint // 用户 ID
name string // 用户名
birthday string // 出生日期
gender uint8 // 性别
}
var user User
// 将查询结果中的字段值扫描并赋值给 User 结构体中的字段
if err := result.Scan(&user.id, &user.name, &user.birthday, &user.gender); err != nil {
// 如果出现错误,则记录错误信息并返回
log.Error(err)
return
}
// 输出查询到的用户信息
log.Info(user)
}
执行 go test,将会看到如下的输出: