Xorm 单库引擎

所有操作均需要事先创建并配置 ORM 引擎才可以进行。XORM 支持两种 ORM 引擎,即 Engine 引擎和 Engine Group 引擎。一个 Engine 引擎用于对单个数据库进行操作,一个 Engine Group 引擎用于对读写分离的数据库或者负载均衡的数据库进行操作。Engine 引擎和 EngineGroup 引擎的 API 基本相同,所有适用于 Engine 的 API 基本上都适用于 EngineGroup,并且可以比较容易的从 Engine 引擎迁移到 EngineGroup 引擎。

单个 ORM 引擎,也称为 Engine。一个应用程序可以同时存在多个 Engine 引擎,一个 Engine 一般只对应一个数据库。

 

1. 创建 Xorm 单库引擎

创建 Xorm Engine,需要调用 xorm.NewEngine 生成,如:

import (
    _ "github.com/go-sql-driver/mysql"
    "github.com/go-xorm/xorm"
)

var engine *xorm.Engine

func main() {
    var err error
    engine, err = xorm.NewEngine("mysql", "root:123@/test?charset=utf8")
}

或者

import (
    _ "github.com/mattn/go-sqlite3"
    "github.com/go-xorm/xorm"
)

var engine *xorm.Engine

func main() {
    var err error
    engine, err = xorm.NewEngine("sqlite3", "./test.db")
}

一般情况下如果只操作一个数据库,只需要创建一个engine即可。engine是GoRoutine安全的。

创建完成engine之后,并没有立即连接数据库,此时可以通过engine.Ping()来进行数据库的连接测试是否可以连接到数据库。另外对于某些数据库有连接超时设置的,可以通过起一个定期Ping的Go程来保持连接鲜活。

对于有大量数据并且需要分区的应用,也可以根据规则来创建多个Engine,比如:

var err error
for i:=0;i<5;i++ {
    engines[i], err = xorm.NewEngine("sqlite3", fmt.Sprintf("./test%d.db", i))
}

engine可以通过engine.Close来手动关闭,但是一般情况下可以不用关闭,在程序退出时会自动关闭。

 

2. 数据库驱动资源

NewEngine 传入的参数和 sql.Open 传入的参数完全相同,因此,在使用某个驱动前,请查看此驱动中关于传入参数的说明文档。

以下为各个驱动的连接符对应的文档链接:

在engine创建完成后可以进行一些设置,如:

 

3. 日志

日志是一个接口,通过设置日志,可以显示SQL,警告以及错误等,默认的显示级别为INFO。

  • engine.ShowSQL(true),则会在控制台打印出生成的SQL语句;
  • engine.Logger().SetLevel(core.LOG_DEBUG),则会在控制台打印调试及以上的信息。

如果希望将信息不仅打印到控制台,而是保存为文件,那么可以通过类似如下的代码实现,NewSimpleLogger(w io.Writer)接收一个io.Writer接口来将数据写入到对应的设施中。

f, err := os.Create("sql.log")
if err != nil {
    println(err.Error())
    return
}
engine.SetLogger(xorm.NewSimpleLogger(f))

当然,如果希望将日志记录到syslog中,也可以如下:

logWriter, err := syslog.New(syslog.LOG_DEBUG, "rest-xorm-example")
if err != nil {
    log.Fatalf("Fail to create xorm system logger: %v\n", err)
}

logger := xorm.NewSimpleLogger(logWriter)
logger.ShowSQL(true)
engine.SetLogger(logger)

 

4. 连接池

engine内部支持连接池接口和对应的函数。

  • 如果需要设置连接池的空闲数大小,可以使用engine.SetMaxIdleConns()来实现。
  • 如果需要设置最大打开连接数,则可以使用engine.SetMaxOpenConns()来实现。

引擎组:通过创建引擎组 EngineGroup 来实现对从数据库(Master/Slave)读写分离的支持。在 xorm 里面,可以同时存在多个 Orm 引擎,一个 Orm 引擎称为 Engine,一个Engine 一般只对应一个数据库,而 ...