From a0aaa7d72b4e37f2a1d549e859cca83504e2977d Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Tue, 16 Feb 2016 17:18:01 +0800 Subject: [PATCH] logging interface changed and resolved #160 #219 #353 --- README.md | 5 ++ README_CN.md | 10 +-- VERSION | 2 +- engine.go | 150 +++++++++++++++++++++++++++----------------- logger.go | 25 ++++++-- mssql_dialect.go | 3 + mysql_dialect.go | 13 +--- oracle_dialect.go | 26 +++----- postgres_dialect.go | 19 ++---- session.go | 7 +-- sqlite3_dialect.go | 17 ++--- xorm.go | 6 +- 12 files changed, 152 insertions(+), 131 deletions(-) diff --git a/README.md b/README.md index 4b4685ea..5f92360a 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,11 @@ Drivers for Go's sql package which currently support database/sql includes: # Changelog +* **v0.4.5** + * many bugs fixed + * extends support unlimited deep + * Delete Limit support + * **v0.4.4** * ql database expriment support * tidb database expriment support diff --git a/README_CN.md b/README_CN.md index 4466bc70..4fbb0639 100644 --- a/README_CN.md +++ b/README_CN.md @@ -52,6 +52,11 @@ xorm是一个简单而强大的Go语言ORM库. 通过它可以使数据库操作 ## 更新日志 +* **v0.4.5** + * bug修正 + * extends 支持无限级 + * Delete Limit 支持 + * **v0.4.4** * Tidb 数据库支持 * QL 试验性支持 @@ -59,11 +64,6 @@ xorm是一个简单而强大的Go语言ORM库. 通过它可以使数据库操作 * ForUpdate 支持 * bug修正 -* **v0.4.3** - * Json 字段类型支持 - * oracle实验性支持 - * bug修正 - [更多更新日志...](https://github.com/go-xorm/manual-zh-CN/tree/master/chapter-16) ## 安装 diff --git a/VERSION b/VERSION index d1a98fc7..40bc6907 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -xorm v0.4.5.0204 +xorm v0.5.0.0216 diff --git a/engine.go b/engine.go index afb38766..e21bf92d 100644 --- a/engine.go +++ b/engine.go @@ -36,23 +36,47 @@ type Engine struct { mutex *sync.RWMutex Cacher core.Cacher - ShowSQL bool + // 是否显示SQL + showSQL bool + showExecTime bool + //ShowSQL bool // !nashtsai! TODO ought to deprecate these but having logger to control its log level - ShowInfo bool - ShowErr bool - ShowDebug bool - ShowWarn bool + /*ShowInfo bool + ShowErr bool*/ + //ShowDebug bool + //ShowWarn bool*/ // --227 - Logger core.ILogger + logger core.ILogger TZLocation *time.Location disableGlobalCache bool } +func (engine *Engine) ShowSQL(show ...bool) { + engine.logger.ShowSQL(show...) + if len(show) == 0 { + engine.showSQL = true + } else { + engine.showSQL = show[0] + } +} + +func (engine *Engine) ShowExecTime(show ...bool) { + if len(show) == 0 { + engine.showExecTime = true + } else { + engine.showExecTime = show[0] + } +} + +func (engine *Engine) Logger() core.ILogger { + return engine.logger +} + func (engine *Engine) SetLogger(logger core.ILogger) { - engine.Logger = logger + engine.logger = logger engine.dialect.SetLogger(logger) } @@ -194,34 +218,42 @@ func (engine *Engine) Ping() error { // logging sql func (engine *Engine) logSQL(sqlStr string, sqlArgs ...interface{}) { - if engine.ShowSQL { - engine.overrideLogLevel(core.LOG_INFO) + if engine.showSQL && !engine.showExecTime { + //engine.overrideLogLevel(core.LOG_INFO) if len(sqlArgs) > 0 { - engine.Logger.Infof("[sql] %v [args] %v", sqlStr, sqlArgs) + engine.logger.Infof("[sql] %v [args] %v", sqlStr, sqlArgs) } else { - engine.Logger.Infof("[sql] %v", sqlStr) + engine.logger.Infof("[sql] %v", sqlStr) } } } -func (engine *Engine) LogSQLQueryTime(sqlStr string, args interface{}, executionBlock func() (*core.Stmt, *core.Rows, error)) (*core.Stmt, *core.Rows, error) { - if engine.ShowDebug { +func (engine *Engine) logSQLQueryTime(sqlStr string, args []interface{}, executionBlock func() (*core.Stmt, *core.Rows, error)) (*core.Stmt, *core.Rows, error) { + if engine.showSQL && engine.showExecTime { b4ExecTime := time.Now() stmt, res, err := executionBlock() execDuration := time.Since(b4ExecTime) - engine.LogDebugf("[time] %s - args %v - query took: %vns", sqlStr, args, execDuration.Nanoseconds()) + if len(args) > 0 { + engine.logger.Infof("[sql] %s [args] %v - took: %v", sqlStr, args, execDuration) + } else { + engine.logger.Infof("[sql] %s - took: %v", sqlStr, execDuration) + } return stmt, res, err } else { return executionBlock() } } -func (engine *Engine) LogSQLExecutionTime(sqlStr string, args interface{}, executionBlock func() (sql.Result, error)) (sql.Result, error) { - if engine.ShowDebug { +func (engine *Engine) logSQLExecutionTime(sqlStr string, args []interface{}, executionBlock func() (sql.Result, error)) (sql.Result, error) { + if engine.showSQL && engine.showExecTime { b4ExecTime := time.Now() res, err := executionBlock() execDuration := time.Since(b4ExecTime) - engine.LogDebugf("[time] %s - args %v - execution took: %vns", sqlStr, args, execDuration.Nanoseconds()) + if len(args) > 0 { + engine.logger.Infof("[sql] %s [args] %v - took: %v", sqlStr, args, execDuration) + } else { + engine.logger.Infof("[sql] %s - took: %v", sqlStr, execDuration) + } return res, err } else { return executionBlock() @@ -229,73 +261,73 @@ func (engine *Engine) LogSQLExecutionTime(sqlStr string, args interface{}, execu } // logging error +/* func (engine *Engine) overrideLogLevel(overrideLevel core.LogLevel) { - logLevel := engine.Logger.Level() + logLevel := engine.logger.Level() if logLevel == core.LOG_UNKNOWN { // intend to left empty } else if logLevel < overrideLevel { // TODO can remove if deprecated engine.ShowErr - engine.Logger.SetLevel(core.LOG_ERR) // try override logger's log level + engine.logger.SetLevel(core.LOG_ERR) // try override logger's log level } - -} +}*/ func (engine *Engine) LogError(contents ...interface{}) { - if engine.ShowErr { - engine.overrideLogLevel(core.LOG_ERR) - engine.Logger.Err(contents...) - } + //if engine.ShowErr { + // engine.overrideLogLevel(core.LOG_ERR) + engine.logger.Err(contents...) + //} } func (engine *Engine) LogErrorf(format string, contents ...interface{}) { - if engine.ShowErr { - engine.overrideLogLevel(core.LOG_ERR) - engine.Logger.Errf(format, contents...) - } + //if engine.ShowErr { + // engine.overrideLogLevel(core.LOG_ERR) + engine.logger.Errf(format, contents...) + //} } // logging info func (engine *Engine) LogInfo(contents ...interface{}) { - if engine.ShowInfo { - engine.overrideLogLevel(core.LOG_INFO) - engine.Logger.Info(contents...) - } + //if engine.ShowInfo { + // engine.overrideLogLevel(core.LOG_INFO) + engine.logger.Info(contents...) + //} } func (engine *Engine) LogInfof(format string, contents ...interface{}) { - if engine.ShowErr { - engine.overrideLogLevel(core.LOG_INFO) - engine.Logger.Infof(format, contents...) - } + //if engine.ShowErr { + // engine.overrideLogLevel(core.LOG_INFO) + engine.logger.Infof(format, contents...) + //} } // logging debug func (engine *Engine) LogDebug(contents ...interface{}) { - if engine.ShowDebug { - engine.overrideLogLevel(core.LOG_DEBUG) - engine.Logger.Debug(contents...) - } + //if engine.ShowDebug { + // engine.overrideLogLevel(core.LOG_DEBUG) + engine.logger.Debug(contents...) + //} } func (engine *Engine) LogDebugf(format string, contents ...interface{}) { - if engine.ShowDebug { - engine.overrideLogLevel(core.LOG_DEBUG) - engine.Logger.Debugf(format, contents...) - } + //if engine.ShowDebug { + // engine.overrideLogLevel(core.LOG_DEBUG) + engine.logger.Debugf(format, contents...) + //} } // logging warn func (engine *Engine) LogWarn(contents ...interface{}) { - if engine.ShowWarn { - engine.overrideLogLevel(core.LOG_WARNING) - engine.Logger.Warning(contents...) - } + //if engine.ShowWarn { + // engine.overrideLogLevel(core.LOG_WARNING) + engine.logger.Warning(contents...) + //} } func (engine *Engine) LogWarnf(format string, contents ...interface{}) { - if engine.ShowWarn { - engine.overrideLogLevel(core.LOG_WARNING) - engine.Logger.Warningf(format, contents...) - } + //if engine.ShowWarn { + // engine.overrideLogLevel(core.LOG_WARNING) + engine.logger.Warningf(format, contents...) + //} } // Sql method let's you manualy write raw sql and operate @@ -985,15 +1017,15 @@ func (engine *Engine) mapType(v reflect.Value) *core.Table { if hasCacheTag { if engine.Cacher != nil { // !nash! use engine's cacher if provided - engine.Logger.Info("enable cache on table:", table.Name) + engine.logger.Info("enable cache on table:", table.Name) table.Cacher = engine.Cacher } else { - engine.Logger.Info("enable LRU cache on table:", table.Name) + engine.logger.Info("enable LRU cache on table:", table.Name) table.Cacher = NewLRUCacher2(NewMemoryStore(), time.Hour, 10000) // !nashtsai! HACK use LRU cacher for now } } if hasNoCacheTag { - engine.Logger.Info("no cache on table:", table.Name) + engine.logger.Info("no cache on table:", table.Name) table.Cacher = nil } @@ -1405,16 +1437,18 @@ func (engine *Engine) Import(r io.Reader) ([]sql.Result, error) { scanner.Split(semiColSpliter) for scanner.Scan() { - query := scanner.Text() - query = strings.Trim(query, " \t") + query := strings.Trim(scanner.Text(), " \t\n\r") if len(query) > 0 { + engine.logSQL(query) result, err := engine.DB().Exec(query) results = append(results, result) if err != nil { + return nil, err lastError = err } } } + return results, lastError } diff --git a/logger.go b/logger.go index 31787ba0..5b8ac5b2 100644 --- a/logger.go +++ b/logger.go @@ -19,13 +19,16 @@ const ( ) type SimpleLogger struct { - DEBUG *log.Logger - ERR *log.Logger - INFO *log.Logger - WARN *log.Logger - level core.LogLevel + DEBUG *log.Logger + ERR *log.Logger + INFO *log.Logger + WARN *log.Logger + level core.LogLevel + showSQL bool } +var _ core.ILogger = &SimpleLogger{} + func NewSimpleLogger(out io.Writer) *SimpleLogger { return NewSimpleLogger2(out, DEFAULT_LOG_PREFIX, DEFAULT_LOG_FLAG) } @@ -108,3 +111,15 @@ func (s *SimpleLogger) SetLevel(l core.LogLevel) (err error) { s.level = l return } + +func (s *SimpleLogger) ShowSQL(show ...bool) { + if len(show) == 0 { + s.showSQL = true + return + } + s.showSQL = show[0] +} + +func (s *SimpleLogger) IsShowSQL() bool { + return s.showSQL +} diff --git a/mssql_dialect.go b/mssql_dialect.go index 41989b91..e738dc6c 100644 --- a/mssql_dialect.go +++ b/mssql_dialect.go @@ -337,6 +337,7 @@ func (db *mssql) GetColumns(tableName string) ([]string, map[string]*core.Column s := `select a.name as name, b.name as ctype,a.max_length,a.precision,a.scale from sys.columns a left join sys.types b on a.user_type_id=b.user_type_id where a.object_id=object_id('` + tableName + `')` + db.LogSQL(s, args) rows, err := db.DB().Query(s, args...) if err != nil { @@ -394,6 +395,7 @@ where a.object_id=object_id('` + tableName + `')` func (db *mssql) GetTables() ([]*core.Table, error) { args := []interface{}{} s := `select name from sysobjects where xtype ='U'` + db.LogSQL(s, args) rows, err := db.DB().Query(s, args...) if err != nil { @@ -428,6 +430,7 @@ INNER JOIN SYS.COLUMNS C ON IXS.OBJECT_ID=C.OBJECT_ID AND IXCS.COLUMN_ID=C.COLUMN_ID WHERE IXS.TYPE_DESC='NONCLUSTERED' and OBJECT_NAME(IXS.OBJECT_ID) =? ` + db.LogSQL(s, args) rows, err := db.DB().Query(s, args...) if err != nil { diff --git a/mysql_dialect.go b/mysql_dialect.go index 76a84a7f..1a693753 100644 --- a/mysql_dialect.go +++ b/mysql_dialect.go @@ -303,12 +303,9 @@ func (db *mysql) GetColumns(tableName string) ([]string, map[string]*core.Column args := []interface{}{db.DbName, tableName} s := "SELECT `COLUMN_NAME`, `IS_NULLABLE`, `COLUMN_DEFAULT`, `COLUMN_TYPE`," + " `COLUMN_KEY`, `EXTRA` FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE `TABLE_SCHEMA` = ? AND `TABLE_NAME` = ?" + db.LogSQL(s, args) rows, err := db.DB().Query(s, args...) - if db.Logger != nil { - db.Logger.Info("[sql]", s, args) - } - if err != nil { return nil, nil, err } @@ -415,11 +412,9 @@ func (db *mysql) GetTables() ([]*core.Table, error) { args := []interface{}{db.DbName} s := "SELECT `TABLE_NAME`, `ENGINE`, `TABLE_ROWS`, `AUTO_INCREMENT` from " + "`INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA`=? AND (`ENGINE`='MyISAM' OR `ENGINE` = 'InnoDB')" + db.LogSQL(s, args) rows, err := db.DB().Query(s, args...) - if db.Logger != nil { - db.Logger.Info("[sql]", s, args) - } if err != nil { return nil, err } @@ -445,11 +440,9 @@ func (db *mysql) GetTables() ([]*core.Table, error) { func (db *mysql) GetIndexes(tableName string) (map[string]*core.Index, error) { args := []interface{}{db.DbName, tableName} s := "SELECT `INDEX_NAME`, `NON_UNIQUE`, `COLUMN_NAME` FROM `INFORMATION_SCHEMA`.`STATISTICS` WHERE `TABLE_SCHEMA` = ? AND `TABLE_NAME` = ?" + db.LogSQL(s, args) rows, err := db.DB().Query(s, args...) - if db.Logger != nil { - db.Logger.Info("[sql]", s, args) - } if err != nil { return nil, err } diff --git a/oracle_dialect.go b/oracle_dialect.go index dc64c00e..8b28902f 100644 --- a/oracle_dialect.go +++ b/oracle_dialect.go @@ -637,9 +637,7 @@ func (db *oracle) TableCheckSql(tableName string) (string, []interface{}) { func (db *oracle) MustDropTable(tableName string) error { sql, args := db.TableCheckSql(tableName) - if db.Logger != nil { - db.Logger.Info("[sql]", sql, args) - } + db.LogSQL(sql, args) rows, err := db.DB().Query(sql, args...) if err != nil { @@ -652,9 +650,8 @@ func (db *oracle) MustDropTable(tableName string) error { } sql = "Drop Table \"" + tableName + "\"" - if db.Logger != nil { - db.Logger.Info("[sql]", sql) - } + db.LogSQL(sql, args) + _, err = db.DB().Exec(sql) return err } @@ -669,10 +666,9 @@ func (db *oracle) IsColumnExist(tableName, colName string) (bool, error) { args := []interface{}{tableName, colName} query := "SELECT column_name FROM USER_TAB_COLUMNS WHERE table_name = :1" + " AND column_name = :2" + db.LogSQL(query, args) + rows, err := db.DB().Query(query, args...) - if db.Logger != nil { - db.Logger.Info("[sql]", query, args) - } if err != nil { return false, err } @@ -688,11 +684,9 @@ func (db *oracle) GetColumns(tableName string) ([]string, map[string]*core.Colum args := []interface{}{tableName} s := "SELECT column_name,data_default,data_type,data_length,data_precision,data_scale," + "nullable FROM USER_TAB_COLUMNS WHERE table_name = :1" + db.LogSQL(s, args) rows, err := db.DB().Query(s, args...) - if db.Logger != nil { - db.Logger.Info("[sql]", s, args) - } if err != nil { return nil, nil, err } @@ -787,11 +781,9 @@ func (db *oracle) GetColumns(tableName string) ([]string, map[string]*core.Colum func (db *oracle) GetTables() ([]*core.Table, error) { args := []interface{}{} s := "SELECT table_name FROM user_tables" + db.LogSQL(s, args) rows, err := db.DB().Query(s, args...) - if db.Logger != nil { - db.Logger.Info("[sql]", s, args) - } if err != nil { return nil, err } @@ -814,11 +806,9 @@ func (db *oracle) GetIndexes(tableName string) (map[string]*core.Index, error) { args := []interface{}{tableName} s := "SELECT t.column_name,i.uniqueness,i.index_name FROM user_ind_columns t,user_indexes i " + "WHERE t.index_name = i.index_name and t.table_name = i.table_name and t.table_name =:1" + db.LogSQL(s, args) rows, err := db.DB().Query(s, args...) - if db.Logger != nil { - db.Logger.Info("[sql]", s, args) - } if err != nil { return nil, err } diff --git a/postgres_dialect.go b/postgres_dialect.go index 972a214f..3b1a122a 100644 --- a/postgres_dialect.go +++ b/postgres_dialect.go @@ -900,10 +900,9 @@ func (db *postgres) IsColumnExist(tableName, colName string) (bool, error) { args := []interface{}{tableName, colName} query := "SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = $1" + " AND column_name = $2" + db.LogSQL(query, args) + rows, err := db.DB().Query(query, args...) - if db.Logger != nil { - db.Logger.Info("[sql]", query, args) - } if err != nil { return false, err } @@ -914,7 +913,7 @@ func (db *postgres) IsColumnExist(tableName, colName string) (bool, error) { func (db *postgres) GetColumns(tableName string) ([]string, map[string]*core.Column, error) { pgSchema := "public" - args := []interface{}{tableName,pgSchema} + args := []interface{}{tableName, pgSchema} s := `SELECT column_name, column_default, is_nullable, data_type, character_maximum_length, numeric_precision, numeric_precision_radix , CASE WHEN p.contype = 'p' THEN true ELSE false END AS primarykey, CASE WHEN p.contype = 'u' THEN true ELSE false END AS uniquekey @@ -926,11 +925,9 @@ FROM pg_attribute f LEFT JOIN pg_class AS g ON p.confrelid = g.oid LEFT JOIN INFORMATION_SCHEMA.COLUMNS s ON s.column_name=f.attname AND c.relname=s.table_name WHERE c.relkind = 'r'::char AND c.relname = $1 AND s.table_schema = $2 AND f.attnum > 0 ORDER BY f.attnum;` + db.LogSQL(s, args) rows, err := db.DB().Query(s, args...) - if db.Logger != nil { - db.Logger.Info("[sql]", s, args) - } if err != nil { return nil, nil, err } @@ -1017,11 +1014,9 @@ WHERE c.relkind = 'r'::char AND c.relname = $1 AND s.table_schema = $2 AND f.att func (db *postgres) GetTables() ([]*core.Table, error) { args := []interface{}{} s := "SELECT tablename FROM pg_tables where schemaname = 'public'" + db.LogSQL(s, args) rows, err := db.DB().Query(s, args...) - if db.Logger != nil { - db.Logger.Info("[sql]", s, args) - } if err != nil { return nil, err } @@ -1044,11 +1039,9 @@ func (db *postgres) GetTables() ([]*core.Table, error) { func (db *postgres) GetIndexes(tableName string) (map[string]*core.Index, error) { args := []interface{}{tableName} s := "SELECT indexname, indexdef FROM pg_indexes WHERE schemaname='public' AND tablename=$1" + db.LogSQL(s, args) rows, err := db.DB().Query(s, args...) - if db.Logger != nil { - db.Logger.Info("[sql]", s, args) - } if err != nil { return nil, err } diff --git a/session.go b/session.go index b7ce7ff6..39c6a92a 100644 --- a/session.go +++ b/session.go @@ -496,9 +496,9 @@ func (session *Session) exec(sqlStr string, args ...interface{}) (sql.Result, er session.saveLastSQL(sqlStr, args...) - return session.Engine.LogSQLExecutionTime(sqlStr, args, func() (sql.Result, error) { + return session.Engine.logSQLExecutionTime(sqlStr, args, func() (sql.Result, error) { if session.IsAutoCommit { - //oci8 can not auto commit (github.com/mattn/go-oci8) + // FIXME: oci8 can not auto commit (github.com/mattn/go-oci8) if session.Engine.dialect.DBType() == core.ORACLE { session.Begin() r, err := session.Tx.Exec(sqlStr, args...) @@ -573,7 +573,6 @@ func (session *Session) CreateUniques(bean interface{}) error { func (session *Session) createOneTable() error { sqlStr := session.Statement.genCreateTableSQL() - session.Engine.LogDebug("create table sql: [", sqlStr, "]") _, err := session.exec(sqlStr) return err } @@ -2100,7 +2099,7 @@ func (session *Session) innerQuery(sqlStr string, params ...interface{}) ([]map[ return nil, rows, err } } - _, rows, err := session.Engine.LogSQLQueryTime(sqlStr, params, callback) + _, rows, err := session.Engine.logSQLQueryTime(sqlStr, params, callback) if rows != nil { defer rows.Close() } diff --git a/sqlite3_dialect.go b/sqlite3_dialect.go index 9f29d587..1fe8aa1c 100644 --- a/sqlite3_dialect.go +++ b/sqlite3_dialect.go @@ -264,10 +264,8 @@ func (db *sqlite3) ForUpdateSql(query string) string { func (db *sqlite3) IsColumnExist(tableName, colName string) (bool, error) { args := []interface{}{tableName} query := "SELECT name FROM sqlite_master WHERE type='table' and name = ? and ((sql like '%`" + colName + "`%') or (sql like '%[" + colName + "]%'))" + db.LogSQL(query, args) rows, err := db.DB().Query(query, args...) - if db.Logger != nil { - db.Logger.Info("[sql]", query, args) - } if err != nil { return false, err } @@ -282,11 +280,8 @@ func (db *sqlite3) IsColumnExist(tableName, colName string) (bool, error) { func (db *sqlite3) GetColumns(tableName string) ([]string, map[string]*core.Column, error) { args := []interface{}{tableName} s := "SELECT sql FROM sqlite_master WHERE type='table' and name = ?" - + db.LogSQL(s, args) rows, err := db.DB().Query(s, args...) - if db.Logger != nil { - db.Logger.Info("[sql]", s, args) - } if err != nil { return nil, nil, err } @@ -354,11 +349,9 @@ func (db *sqlite3) GetColumns(tableName string) ([]string, map[string]*core.Colu func (db *sqlite3) GetTables() ([]*core.Table, error) { args := []interface{}{} s := "SELECT name FROM sqlite_master WHERE type='table'" + db.LogSQL(s, args) rows, err := db.DB().Query(s, args...) - if db.Logger != nil { - db.Logger.Info("[sql]", s, args) - } if err != nil { return nil, err } @@ -382,11 +375,9 @@ func (db *sqlite3) GetTables() ([]*core.Table, error) { func (db *sqlite3) GetIndexes(tableName string) (map[string]*core.Index, error) { args := []interface{}{tableName} s := "SELECT sql FROM sqlite_master WHERE type='index' and tbl_name = ?" + db.LogSQL(s, args) rows, err := db.DB().Query(s, args...) - if db.Logger != nil { - db.Logger.Info("[sql]", s, args) - } if err != nil { return nil, err } diff --git a/xorm.go b/xorm.go index 2da9949e..d31e2b11 100644 --- a/xorm.go +++ b/xorm.go @@ -17,7 +17,7 @@ import ( ) const ( - Version string = "0.4.5.0204" + Version string = "0.5.0.0216" ) func regDrvsNDialects() bool { @@ -84,12 +84,10 @@ func NewEngine(driverName string, dataSourceName string) (*Engine, error) { Tables: make(map[reflect.Type]*core.Table), mutex: &sync.RWMutex{}, TagIdentifier: "xorm", - Logger: NewSimpleLogger(os.Stdout), TZLocation: time.Local, } - engine.dialect.SetLogger(engine.Logger) - + engine.SetLogger(NewSimpleLogger(os.Stdout)) engine.SetMapper(core.NewCacheMapper(new(core.SnakeMapper))) runtime.SetFinalizer(engine, close)