This repository has been archived on 2022-04-14. You can view files and clone it, but cannot push or open issues or pull requests.
manual-zh-CN/chapter-01/1.engine.md
2022-02-21 11:48:05 +08:00

104 lines
3.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 创建 Engine 引擎
单个ORM引擎也称为Engine。一个 APP 可以同时存在多个 Engine 引擎一个Engine一般只对应一个数据库。Engine 通过调用 `xorm.NewEngine` 生成,如:
```Go
import (
_ "github.com/go-sql-driver/mysql"
"xorm.io/xorm"
)
var engine *xorm.Engine
func main() {
var err error
engine, err = xorm.NewEngine("mysql", "root:123@/test?charset=utf8")
}
```
or
```Go
import (
_ "github.com/mattn/go-sqlite3"
"xorm.io/xorm"
)
var engine *xorm.Engine
func main() {
var err error
engine, err = xorm.NewEngine("sqlite3", "./test.db")
}
```
你也可以用 `NewEngineWithParams`, `NewEngineWithDB``NewEngineWithDialectAndDB`
来创建引擎。
一般情况下如果只操作一个数据库,只需要创建一个 `engine` 即可。`engine` 是 GoRoutine 安全的。
创建完成 `engine` 之后,并没有立即连接数据库,此时可以通过 `engine.Ping()` 或者 `engine.PingContext()` 来进行数据库的连接测试是否可以连接到数据库。另外对于某些数据库有连接超时设置的可以通过起一个定期Ping的Go程来保持连接鲜活。
对于有大量数据并且需要分区的应用也可以根据规则来创建多个Engine比如
```Go
var err error
for i:=0;i<5;i++ {
engines[i], err = xorm.NewEngine("sqlite3", fmt.Sprintf("./test%d.db", i))
}
```
engine 可以通过 engine.Close 来手动关闭,但是一般情况下可以不用关闭,在程序退出时会自动关闭。
NewEngine 传入的参数和`sql.Open`传入的参数完全相同,因此,在使用某个驱动前,请查看此驱动中关于传入参数的说明文档。以下为各个驱动的连接符对应的文档链接:
* [sqlite3](http://pkg.go.dev/github.com/mattn/go-sqlite3#SQLiteDriver.Open)
* [mysql dsn](https://github.com/go-sql-driver/mysql#dsn-data-source-name)
* [mymysql](http://pkg.go.dev/github.com/ziutek/mymysql/godrv#Driver.Open)
* [postgres](http://pkg.go.dev/github.com/lib/pq)
在 engine 创建完成后可以进行一些设置,如:
## 日志
日志是一个接口通过设置日志可以显示SQL警告以及错误等默认的显示级别为 INFO。
* `engine.ShowSQL(true)`则会在控制台打印出生成的SQL语句
* `engine.Logger().SetLevel(log.LOG_DEBUG)`,则会在控制台打印调试及以上的信息;
如果希望将信息不仅打印到控制台,而是保存为文件,那么可以通过类似如下的代码实现,`NewSimpleLogger(w io.Writer)`接收一个io.Writer接口来将数据写入到对应的设施中。
```Go
f, err := os.Create("sql.log")
if err != nil {
println(err.Error())
return
}
engine.SetLogger(log.NewSimpleLogger(f))
```
当然,如果希望将日志记录到 syslog 中,也可以如下:
```Go
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 := log.NewSimpleLogger(logWriter)
logger.ShowSQL(true)
engine.SetLogger(logger)
```
你也可以自定义自己的接口,可通过日志接口中包含的 context 进行更详细的跟踪。
## 连接池
engine内部支持连接池接口和对应的函数。
* 如果需要设置连接池的空闲数大小,可以使用 `engine.SetMaxIdleConns()` 来实现。
* 如果需要设置最大打开连接数,则可以使用 `engine.SetMaxOpenConns()` 来实现。
* 如果需要设置连接的最大生存时间,则可以使用 `engine.SetConnMaxLifetime()` 来实现。