104 lines
3.5 KiB
Markdown
104 lines
3.5 KiB
Markdown
# 创建 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()` 来实现。 |