核心引擎 · Engine引擎

Engine引擎

Session 负责与数据库的交互,那交互前的准备工作(比如连接/测试数据库),交互后的收尾工作(关闭连接)等就交给 Engine 来负责了。Engine 是 GeeORM 与用户交互的入口。代码位于根目录的 engine.go
现在的代码结构为:

1
2
3
4
5
6
7
8
9
mygorm/
log/
|--log.go
|--log_test.go
session/
|--session.go
|--session_test.go
|engine.go
|--go.mod

下面是engine引擎具体代码

  • mygorm/engine.go

    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
    54
    package 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
    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
    package 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)
    }
    这是测试 MyGORM 库的数据库引擎功能。在测试函数中,首先创建了一个数据库引擎实例,并连接到 MySQL 数据库。然后获取一个数据库会话,并执行一条 SQL 查询,将查询结果中的第一行数据扫描到一个名为 User 的结构体中。最后输出查询到的用户信息。

执行 go test,将会看到如下的输出:

engine_test.png




本站由 [PengBin](/) 使用 [Stellar 1.26.3](https://github.com/xaoxuu/hexo-theme-stellar/tree/1.26.3) 主题创建。 本博客所有文章除特别声明外,均采用 [CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/) 许可协议,转载请注明出处。