github.com/go-xorm/xorm xorm庫
xorm是一個簡單而強大的Go語言ORM庫. 通過它可以使數據庫操作非常簡便。xorm的目標並不是讓你完全不去學習SQL,我們認為SQL並不會為ORM所替代,但是ORM將可以解決絕大部分的簡單SQL需求。
在xorm里面,可以同時存在多個Orm引擎,一個Orm引擎稱為Engine,一個Engine一般只對應一個數據庫。Engine通過調用xorm.NewEngine
生成,如:
var engine *xorm.Engine
在使用前,記得導入需要的包
import (
_ "github.com/go-sql-driver/mysql"
"github.com/go-xorm/xorm"
)
創建完成engine之后,並沒有立即連接數據庫,此時可以通過engine.Ping()來進行數據庫的連接測試是否可以連接到數據庫。另外對於某些數據庫有連接超時設置的,可以通過起一個定期Ping的Go程來保持連接鮮活。
engine可以通過engine.Close來手動關閉,但是一般情況下可以不用關閉,在程序退出時會自動關閉。
如果是go-sql-driver,執行exec()也會自動關閉,但是執行Query()則需要關閉。
日志
xorm的日志比使用go-sql-driver要好用,總體來說xorm是現有的orm中值得一用的一個。
日志是一個接口,通過設置日志,可以顯示SQL,警告以及錯誤等,默認的顯示級別為INFO。
engine.ShowSQL(true)
,則會在控制台打印出生成的SQL語句;engine.Logger().SetLevel(core.LOG_DEBUG)
,則會在控制台打印調試及以上的信息;
如果希望將信息不僅打印到控制台,而是保存為文件,那么可以通過類似如下的代碼實現,NewSimpleLogger(w io.Writer)
接收一個io.Writer接口來將數據寫入到對應的設施中。
當然,如果希望將日志記錄到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)
連接池
engine內部支持連接池接口和對應的函數。
ps:go-sql-driver 內部也支持連接池。
- 如果需要設置連接池的空閑數大小,可以使用
engine.SetMaxIdleConns()
來實現。 - 如果需要設置最大打開連接數,則可以使用
engine.SetMaxOpenConns()
來實現。
最后,舉一個xorm的使用例子
var users []User err := engine.Where("name = ?", name).And("age > 10").Limit(10, 0).Find(&users) // SELECT * FROM user WHERE name = ? AND age > 10 limit 0 offset 10 type Detail struct { Id int64 UserId int64 `xorm:"index"` } type UserDetail struct { User `xorm:"extends"` Detail `xorm:"extends"` } var users []UserDetail err := engine.Table("user").Select("user.*, detail.*") Join("INNER", "detail", "detail.user_id = user.id"). Where("user.name = ?", name).Limit(10, 0). Find(&users) // SELECT user.*, detail.* FROM user INNER JOIN detail WHERE user.name = ? limit 0 offset 10