parent
f56113384f
commit
a0aaa7d72b
|
@ -51,6 +51,11 @@ Drivers for Go's sql package which currently support database/sql includes:
|
||||||
|
|
||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
* **v0.4.5**
|
||||||
|
* many bugs fixed
|
||||||
|
* extends support unlimited deep
|
||||||
|
* Delete Limit support
|
||||||
|
|
||||||
* **v0.4.4**
|
* **v0.4.4**
|
||||||
* ql database expriment support
|
* ql database expriment support
|
||||||
* tidb database expriment support
|
* tidb database expriment support
|
||||||
|
|
10
README_CN.md
10
README_CN.md
|
@ -52,6 +52,11 @@ xorm是一个简单而强大的Go语言ORM库. 通过它可以使数据库操作
|
||||||
|
|
||||||
## 更新日志
|
## 更新日志
|
||||||
|
|
||||||
|
* **v0.4.5**
|
||||||
|
* bug修正
|
||||||
|
* extends 支持无限级
|
||||||
|
* Delete Limit 支持
|
||||||
|
|
||||||
* **v0.4.4**
|
* **v0.4.4**
|
||||||
* Tidb 数据库支持
|
* Tidb 数据库支持
|
||||||
* QL 试验性支持
|
* QL 试验性支持
|
||||||
|
@ -59,11 +64,6 @@ xorm是一个简单而强大的Go语言ORM库. 通过它可以使数据库操作
|
||||||
* ForUpdate 支持
|
* ForUpdate 支持
|
||||||
* bug修正
|
* bug修正
|
||||||
|
|
||||||
* **v0.4.3**
|
|
||||||
* Json 字段类型支持
|
|
||||||
* oracle实验性支持
|
|
||||||
* bug修正
|
|
||||||
|
|
||||||
[更多更新日志...](https://github.com/go-xorm/manual-zh-CN/tree/master/chapter-16)
|
[更多更新日志...](https://github.com/go-xorm/manual-zh-CN/tree/master/chapter-16)
|
||||||
|
|
||||||
## 安装
|
## 安装
|
||||||
|
|
150
engine.go
150
engine.go
|
@ -36,23 +36,47 @@ type Engine struct {
|
||||||
mutex *sync.RWMutex
|
mutex *sync.RWMutex
|
||||||
Cacher core.Cacher
|
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
|
// !nashtsai! TODO ought to deprecate these but having logger to control its log level
|
||||||
ShowInfo bool
|
/*ShowInfo bool
|
||||||
ShowErr bool
|
ShowErr bool*/
|
||||||
ShowDebug bool
|
//ShowDebug bool
|
||||||
ShowWarn bool
|
//ShowWarn bool*/
|
||||||
// --227
|
// --227
|
||||||
|
|
||||||
Logger core.ILogger
|
logger core.ILogger
|
||||||
TZLocation *time.Location
|
TZLocation *time.Location
|
||||||
|
|
||||||
disableGlobalCache bool
|
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) {
|
func (engine *Engine) SetLogger(logger core.ILogger) {
|
||||||
engine.Logger = logger
|
engine.logger = logger
|
||||||
engine.dialect.SetLogger(logger)
|
engine.dialect.SetLogger(logger)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -194,34 +218,42 @@ func (engine *Engine) Ping() error {
|
||||||
|
|
||||||
// logging sql
|
// logging sql
|
||||||
func (engine *Engine) logSQL(sqlStr string, sqlArgs ...interface{}) {
|
func (engine *Engine) logSQL(sqlStr string, sqlArgs ...interface{}) {
|
||||||
if engine.ShowSQL {
|
if engine.showSQL && !engine.showExecTime {
|
||||||
engine.overrideLogLevel(core.LOG_INFO)
|
//engine.overrideLogLevel(core.LOG_INFO)
|
||||||
if len(sqlArgs) > 0 {
|
if len(sqlArgs) > 0 {
|
||||||
engine.Logger.Infof("[sql] %v [args] %v", sqlStr, sqlArgs)
|
engine.logger.Infof("[sql] %v [args] %v", sqlStr, sqlArgs)
|
||||||
} else {
|
} 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) {
|
func (engine *Engine) logSQLQueryTime(sqlStr string, args []interface{}, executionBlock func() (*core.Stmt, *core.Rows, error)) (*core.Stmt, *core.Rows, error) {
|
||||||
if engine.ShowDebug {
|
if engine.showSQL && engine.showExecTime {
|
||||||
b4ExecTime := time.Now()
|
b4ExecTime := time.Now()
|
||||||
stmt, res, err := executionBlock()
|
stmt, res, err := executionBlock()
|
||||||
execDuration := time.Since(b4ExecTime)
|
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
|
return stmt, res, err
|
||||||
} else {
|
} else {
|
||||||
return executionBlock()
|
return executionBlock()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (engine *Engine) LogSQLExecutionTime(sqlStr string, args interface{}, executionBlock func() (sql.Result, error)) (sql.Result, error) {
|
func (engine *Engine) logSQLExecutionTime(sqlStr string, args []interface{}, executionBlock func() (sql.Result, error)) (sql.Result, error) {
|
||||||
if engine.ShowDebug {
|
if engine.showSQL && engine.showExecTime {
|
||||||
b4ExecTime := time.Now()
|
b4ExecTime := time.Now()
|
||||||
res, err := executionBlock()
|
res, err := executionBlock()
|
||||||
execDuration := time.Since(b4ExecTime)
|
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
|
return res, err
|
||||||
} else {
|
} else {
|
||||||
return executionBlock()
|
return executionBlock()
|
||||||
|
@ -229,73 +261,73 @@ func (engine *Engine) LogSQLExecutionTime(sqlStr string, args interface{}, execu
|
||||||
}
|
}
|
||||||
|
|
||||||
// logging error
|
// logging error
|
||||||
|
/*
|
||||||
func (engine *Engine) overrideLogLevel(overrideLevel core.LogLevel) {
|
func (engine *Engine) overrideLogLevel(overrideLevel core.LogLevel) {
|
||||||
logLevel := engine.Logger.Level()
|
logLevel := engine.logger.Level()
|
||||||
if logLevel == core.LOG_UNKNOWN {
|
if logLevel == core.LOG_UNKNOWN {
|
||||||
// intend to left empty
|
// intend to left empty
|
||||||
} else if logLevel < overrideLevel { // TODO can remove if deprecated engine.ShowErr
|
} 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{}) {
|
func (engine *Engine) LogError(contents ...interface{}) {
|
||||||
if engine.ShowErr {
|
//if engine.ShowErr {
|
||||||
engine.overrideLogLevel(core.LOG_ERR)
|
// engine.overrideLogLevel(core.LOG_ERR)
|
||||||
engine.Logger.Err(contents...)
|
engine.logger.Err(contents...)
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (engine *Engine) LogErrorf(format string, contents ...interface{}) {
|
func (engine *Engine) LogErrorf(format string, contents ...interface{}) {
|
||||||
if engine.ShowErr {
|
//if engine.ShowErr {
|
||||||
engine.overrideLogLevel(core.LOG_ERR)
|
// engine.overrideLogLevel(core.LOG_ERR)
|
||||||
engine.Logger.Errf(format, contents...)
|
engine.logger.Errf(format, contents...)
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
// logging info
|
// logging info
|
||||||
func (engine *Engine) LogInfo(contents ...interface{}) {
|
func (engine *Engine) LogInfo(contents ...interface{}) {
|
||||||
if engine.ShowInfo {
|
//if engine.ShowInfo {
|
||||||
engine.overrideLogLevel(core.LOG_INFO)
|
// engine.overrideLogLevel(core.LOG_INFO)
|
||||||
engine.Logger.Info(contents...)
|
engine.logger.Info(contents...)
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (engine *Engine) LogInfof(format string, contents ...interface{}) {
|
func (engine *Engine) LogInfof(format string, contents ...interface{}) {
|
||||||
if engine.ShowErr {
|
//if engine.ShowErr {
|
||||||
engine.overrideLogLevel(core.LOG_INFO)
|
// engine.overrideLogLevel(core.LOG_INFO)
|
||||||
engine.Logger.Infof(format, contents...)
|
engine.logger.Infof(format, contents...)
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
// logging debug
|
// logging debug
|
||||||
func (engine *Engine) LogDebug(contents ...interface{}) {
|
func (engine *Engine) LogDebug(contents ...interface{}) {
|
||||||
if engine.ShowDebug {
|
//if engine.ShowDebug {
|
||||||
engine.overrideLogLevel(core.LOG_DEBUG)
|
// engine.overrideLogLevel(core.LOG_DEBUG)
|
||||||
engine.Logger.Debug(contents...)
|
engine.logger.Debug(contents...)
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (engine *Engine) LogDebugf(format string, contents ...interface{}) {
|
func (engine *Engine) LogDebugf(format string, contents ...interface{}) {
|
||||||
if engine.ShowDebug {
|
//if engine.ShowDebug {
|
||||||
engine.overrideLogLevel(core.LOG_DEBUG)
|
// engine.overrideLogLevel(core.LOG_DEBUG)
|
||||||
engine.Logger.Debugf(format, contents...)
|
engine.logger.Debugf(format, contents...)
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
// logging warn
|
// logging warn
|
||||||
func (engine *Engine) LogWarn(contents ...interface{}) {
|
func (engine *Engine) LogWarn(contents ...interface{}) {
|
||||||
if engine.ShowWarn {
|
//if engine.ShowWarn {
|
||||||
engine.overrideLogLevel(core.LOG_WARNING)
|
// engine.overrideLogLevel(core.LOG_WARNING)
|
||||||
engine.Logger.Warning(contents...)
|
engine.logger.Warning(contents...)
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (engine *Engine) LogWarnf(format string, contents ...interface{}) {
|
func (engine *Engine) LogWarnf(format string, contents ...interface{}) {
|
||||||
if engine.ShowWarn {
|
//if engine.ShowWarn {
|
||||||
engine.overrideLogLevel(core.LOG_WARNING)
|
// engine.overrideLogLevel(core.LOG_WARNING)
|
||||||
engine.Logger.Warningf(format, contents...)
|
engine.logger.Warningf(format, contents...)
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sql method let's you manualy write raw sql and operate
|
// 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 hasCacheTag {
|
||||||
if engine.Cacher != nil { // !nash! use engine's cacher if provided
|
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
|
table.Cacher = engine.Cacher
|
||||||
} else {
|
} 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
|
table.Cacher = NewLRUCacher2(NewMemoryStore(), time.Hour, 10000) // !nashtsai! HACK use LRU cacher for now
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if hasNoCacheTag {
|
if hasNoCacheTag {
|
||||||
engine.Logger.Info("no cache on table:", table.Name)
|
engine.logger.Info("no cache on table:", table.Name)
|
||||||
table.Cacher = nil
|
table.Cacher = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1405,16 +1437,18 @@ func (engine *Engine) Import(r io.Reader) ([]sql.Result, error) {
|
||||||
scanner.Split(semiColSpliter)
|
scanner.Split(semiColSpliter)
|
||||||
|
|
||||||
for scanner.Scan() {
|
for scanner.Scan() {
|
||||||
query := scanner.Text()
|
query := strings.Trim(scanner.Text(), " \t\n\r")
|
||||||
query = strings.Trim(query, " \t")
|
|
||||||
if len(query) > 0 {
|
if len(query) > 0 {
|
||||||
|
engine.logSQL(query)
|
||||||
result, err := engine.DB().Exec(query)
|
result, err := engine.DB().Exec(query)
|
||||||
results = append(results, result)
|
results = append(results, result)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
lastError = err
|
lastError = err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return results, lastError
|
return results, lastError
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
25
logger.go
25
logger.go
|
@ -19,13 +19,16 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
type SimpleLogger struct {
|
type SimpleLogger struct {
|
||||||
DEBUG *log.Logger
|
DEBUG *log.Logger
|
||||||
ERR *log.Logger
|
ERR *log.Logger
|
||||||
INFO *log.Logger
|
INFO *log.Logger
|
||||||
WARN *log.Logger
|
WARN *log.Logger
|
||||||
level core.LogLevel
|
level core.LogLevel
|
||||||
|
showSQL bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ core.ILogger = &SimpleLogger{}
|
||||||
|
|
||||||
func NewSimpleLogger(out io.Writer) *SimpleLogger {
|
func NewSimpleLogger(out io.Writer) *SimpleLogger {
|
||||||
return NewSimpleLogger2(out, DEFAULT_LOG_PREFIX, DEFAULT_LOG_FLAG)
|
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
|
s.level = l
|
||||||
return
|
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
|
||||||
|
}
|
||||||
|
|
|
@ -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
|
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
|
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 + `')`
|
where a.object_id=object_id('` + tableName + `')`
|
||||||
|
db.LogSQL(s, args)
|
||||||
|
|
||||||
rows, err := db.DB().Query(s, args...)
|
rows, err := db.DB().Query(s, args...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -394,6 +395,7 @@ where a.object_id=object_id('` + tableName + `')`
|
||||||
func (db *mssql) GetTables() ([]*core.Table, error) {
|
func (db *mssql) GetTables() ([]*core.Table, error) {
|
||||||
args := []interface{}{}
|
args := []interface{}{}
|
||||||
s := `select name from sysobjects where xtype ='U'`
|
s := `select name from sysobjects where xtype ='U'`
|
||||||
|
db.LogSQL(s, args)
|
||||||
|
|
||||||
rows, err := db.DB().Query(s, args...)
|
rows, err := db.DB().Query(s, args...)
|
||||||
if err != nil {
|
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
|
AND IXCS.COLUMN_ID=C.COLUMN_ID
|
||||||
WHERE IXS.TYPE_DESC='NONCLUSTERED' and OBJECT_NAME(IXS.OBJECT_ID) =?
|
WHERE IXS.TYPE_DESC='NONCLUSTERED' and OBJECT_NAME(IXS.OBJECT_ID) =?
|
||||||
`
|
`
|
||||||
|
db.LogSQL(s, args)
|
||||||
|
|
||||||
rows, err := db.DB().Query(s, args...)
|
rows, err := db.DB().Query(s, args...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -303,12 +303,9 @@ func (db *mysql) GetColumns(tableName string) ([]string, map[string]*core.Column
|
||||||
args := []interface{}{db.DbName, tableName}
|
args := []interface{}{db.DbName, tableName}
|
||||||
s := "SELECT `COLUMN_NAME`, `IS_NULLABLE`, `COLUMN_DEFAULT`, `COLUMN_TYPE`," +
|
s := "SELECT `COLUMN_NAME`, `IS_NULLABLE`, `COLUMN_DEFAULT`, `COLUMN_TYPE`," +
|
||||||
" `COLUMN_KEY`, `EXTRA` FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE `TABLE_SCHEMA` = ? AND `TABLE_NAME` = ?"
|
" `COLUMN_KEY`, `EXTRA` FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE `TABLE_SCHEMA` = ? AND `TABLE_NAME` = ?"
|
||||||
|
db.LogSQL(s, args)
|
||||||
|
|
||||||
rows, err := db.DB().Query(s, args...)
|
rows, err := db.DB().Query(s, args...)
|
||||||
if db.Logger != nil {
|
|
||||||
db.Logger.Info("[sql]", s, args)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
@ -415,11 +412,9 @@ func (db *mysql) GetTables() ([]*core.Table, error) {
|
||||||
args := []interface{}{db.DbName}
|
args := []interface{}{db.DbName}
|
||||||
s := "SELECT `TABLE_NAME`, `ENGINE`, `TABLE_ROWS`, `AUTO_INCREMENT` from " +
|
s := "SELECT `TABLE_NAME`, `ENGINE`, `TABLE_ROWS`, `AUTO_INCREMENT` from " +
|
||||||
"`INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA`=? AND (`ENGINE`='MyISAM' OR `ENGINE` = 'InnoDB')"
|
"`INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA`=? AND (`ENGINE`='MyISAM' OR `ENGINE` = 'InnoDB')"
|
||||||
|
db.LogSQL(s, args)
|
||||||
|
|
||||||
rows, err := db.DB().Query(s, args...)
|
rows, err := db.DB().Query(s, args...)
|
||||||
if db.Logger != nil {
|
|
||||||
db.Logger.Info("[sql]", s, args)
|
|
||||||
}
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
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) {
|
func (db *mysql) GetIndexes(tableName string) (map[string]*core.Index, error) {
|
||||||
args := []interface{}{db.DbName, tableName}
|
args := []interface{}{db.DbName, tableName}
|
||||||
s := "SELECT `INDEX_NAME`, `NON_UNIQUE`, `COLUMN_NAME` FROM `INFORMATION_SCHEMA`.`STATISTICS` WHERE `TABLE_SCHEMA` = ? AND `TABLE_NAME` = ?"
|
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...)
|
rows, err := db.DB().Query(s, args...)
|
||||||
if db.Logger != nil {
|
|
||||||
db.Logger.Info("[sql]", s, args)
|
|
||||||
}
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -637,9 +637,7 @@ func (db *oracle) TableCheckSql(tableName string) (string, []interface{}) {
|
||||||
|
|
||||||
func (db *oracle) MustDropTable(tableName string) error {
|
func (db *oracle) MustDropTable(tableName string) error {
|
||||||
sql, args := db.TableCheckSql(tableName)
|
sql, args := db.TableCheckSql(tableName)
|
||||||
if db.Logger != nil {
|
db.LogSQL(sql, args)
|
||||||
db.Logger.Info("[sql]", sql, args)
|
|
||||||
}
|
|
||||||
|
|
||||||
rows, err := db.DB().Query(sql, args...)
|
rows, err := db.DB().Query(sql, args...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -652,9 +650,8 @@ func (db *oracle) MustDropTable(tableName string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
sql = "Drop Table \"" + tableName + "\""
|
sql = "Drop Table \"" + tableName + "\""
|
||||||
if db.Logger != nil {
|
db.LogSQL(sql, args)
|
||||||
db.Logger.Info("[sql]", sql)
|
|
||||||
}
|
|
||||||
_, err = db.DB().Exec(sql)
|
_, err = db.DB().Exec(sql)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -669,10 +666,9 @@ func (db *oracle) IsColumnExist(tableName, colName string) (bool, error) {
|
||||||
args := []interface{}{tableName, colName}
|
args := []interface{}{tableName, colName}
|
||||||
query := "SELECT column_name FROM USER_TAB_COLUMNS WHERE table_name = :1" +
|
query := "SELECT column_name FROM USER_TAB_COLUMNS WHERE table_name = :1" +
|
||||||
" AND column_name = :2"
|
" AND column_name = :2"
|
||||||
|
db.LogSQL(query, args)
|
||||||
|
|
||||||
rows, err := db.DB().Query(query, args...)
|
rows, err := db.DB().Query(query, args...)
|
||||||
if db.Logger != nil {
|
|
||||||
db.Logger.Info("[sql]", query, args)
|
|
||||||
}
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
@ -688,11 +684,9 @@ func (db *oracle) GetColumns(tableName string) ([]string, map[string]*core.Colum
|
||||||
args := []interface{}{tableName}
|
args := []interface{}{tableName}
|
||||||
s := "SELECT column_name,data_default,data_type,data_length,data_precision,data_scale," +
|
s := "SELECT column_name,data_default,data_type,data_length,data_precision,data_scale," +
|
||||||
"nullable FROM USER_TAB_COLUMNS WHERE table_name = :1"
|
"nullable FROM USER_TAB_COLUMNS WHERE table_name = :1"
|
||||||
|
db.LogSQL(s, args)
|
||||||
|
|
||||||
rows, err := db.DB().Query(s, args...)
|
rows, err := db.DB().Query(s, args...)
|
||||||
if db.Logger != nil {
|
|
||||||
db.Logger.Info("[sql]", s, args)
|
|
||||||
}
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
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) {
|
func (db *oracle) GetTables() ([]*core.Table, error) {
|
||||||
args := []interface{}{}
|
args := []interface{}{}
|
||||||
s := "SELECT table_name FROM user_tables"
|
s := "SELECT table_name FROM user_tables"
|
||||||
|
db.LogSQL(s, args)
|
||||||
|
|
||||||
rows, err := db.DB().Query(s, args...)
|
rows, err := db.DB().Query(s, args...)
|
||||||
if db.Logger != nil {
|
|
||||||
db.Logger.Info("[sql]", s, args)
|
|
||||||
}
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -814,11 +806,9 @@ func (db *oracle) GetIndexes(tableName string) (map[string]*core.Index, error) {
|
||||||
args := []interface{}{tableName}
|
args := []interface{}{tableName}
|
||||||
s := "SELECT t.column_name,i.uniqueness,i.index_name FROM user_ind_columns t,user_indexes i " +
|
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"
|
"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...)
|
rows, err := db.DB().Query(s, args...)
|
||||||
if db.Logger != nil {
|
|
||||||
db.Logger.Info("[sql]", s, args)
|
|
||||||
}
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -900,10 +900,9 @@ func (db *postgres) IsColumnExist(tableName, colName string) (bool, error) {
|
||||||
args := []interface{}{tableName, colName}
|
args := []interface{}{tableName, colName}
|
||||||
query := "SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = $1" +
|
query := "SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = $1" +
|
||||||
" AND column_name = $2"
|
" AND column_name = $2"
|
||||||
|
db.LogSQL(query, args)
|
||||||
|
|
||||||
rows, err := db.DB().Query(query, args...)
|
rows, err := db.DB().Query(query, args...)
|
||||||
if db.Logger != nil {
|
|
||||||
db.Logger.Info("[sql]", query, args)
|
|
||||||
}
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
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) {
|
func (db *postgres) GetColumns(tableName string) ([]string, map[string]*core.Column, error) {
|
||||||
pgSchema := "public"
|
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 ,
|
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 = 'p' THEN true ELSE false END AS primarykey,
|
||||||
CASE WHEN p.contype = 'u' THEN true ELSE false END AS uniquekey
|
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 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
|
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;`
|
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...)
|
rows, err := db.DB().Query(s, args...)
|
||||||
if db.Logger != nil {
|
|
||||||
db.Logger.Info("[sql]", s, args)
|
|
||||||
}
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
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) {
|
func (db *postgres) GetTables() ([]*core.Table, error) {
|
||||||
args := []interface{}{}
|
args := []interface{}{}
|
||||||
s := "SELECT tablename FROM pg_tables where schemaname = 'public'"
|
s := "SELECT tablename FROM pg_tables where schemaname = 'public'"
|
||||||
|
db.LogSQL(s, args)
|
||||||
|
|
||||||
rows, err := db.DB().Query(s, args...)
|
rows, err := db.DB().Query(s, args...)
|
||||||
if db.Logger != nil {
|
|
||||||
db.Logger.Info("[sql]", s, args)
|
|
||||||
}
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
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) {
|
func (db *postgres) GetIndexes(tableName string) (map[string]*core.Index, error) {
|
||||||
args := []interface{}{tableName}
|
args := []interface{}{tableName}
|
||||||
s := "SELECT indexname, indexdef FROM pg_indexes WHERE schemaname='public' AND tablename=$1"
|
s := "SELECT indexname, indexdef FROM pg_indexes WHERE schemaname='public' AND tablename=$1"
|
||||||
|
db.LogSQL(s, args)
|
||||||
|
|
||||||
rows, err := db.DB().Query(s, args...)
|
rows, err := db.DB().Query(s, args...)
|
||||||
if db.Logger != nil {
|
|
||||||
db.Logger.Info("[sql]", s, args)
|
|
||||||
}
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -496,9 +496,9 @@ func (session *Session) exec(sqlStr string, args ...interface{}) (sql.Result, er
|
||||||
|
|
||||||
session.saveLastSQL(sqlStr, args...)
|
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 {
|
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 {
|
if session.Engine.dialect.DBType() == core.ORACLE {
|
||||||
session.Begin()
|
session.Begin()
|
||||||
r, err := session.Tx.Exec(sqlStr, args...)
|
r, err := session.Tx.Exec(sqlStr, args...)
|
||||||
|
@ -573,7 +573,6 @@ func (session *Session) CreateUniques(bean interface{}) error {
|
||||||
|
|
||||||
func (session *Session) createOneTable() error {
|
func (session *Session) createOneTable() error {
|
||||||
sqlStr := session.Statement.genCreateTableSQL()
|
sqlStr := session.Statement.genCreateTableSQL()
|
||||||
session.Engine.LogDebug("create table sql: [", sqlStr, "]")
|
|
||||||
_, err := session.exec(sqlStr)
|
_, err := session.exec(sqlStr)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -2100,7 +2099,7 @@ func (session *Session) innerQuery(sqlStr string, params ...interface{}) ([]map[
|
||||||
return nil, rows, err
|
return nil, rows, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_, rows, err := session.Engine.LogSQLQueryTime(sqlStr, params, callback)
|
_, rows, err := session.Engine.logSQLQueryTime(sqlStr, params, callback)
|
||||||
if rows != nil {
|
if rows != nil {
|
||||||
defer rows.Close()
|
defer rows.Close()
|
||||||
}
|
}
|
||||||
|
|
|
@ -264,10 +264,8 @@ func (db *sqlite3) ForUpdateSql(query string) string {
|
||||||
func (db *sqlite3) IsColumnExist(tableName, colName string) (bool, error) {
|
func (db *sqlite3) IsColumnExist(tableName, colName string) (bool, error) {
|
||||||
args := []interface{}{tableName}
|
args := []interface{}{tableName}
|
||||||
query := "SELECT name FROM sqlite_master WHERE type='table' and name = ? and ((sql like '%`" + colName + "`%') or (sql like '%[" + colName + "]%'))"
|
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...)
|
rows, err := db.DB().Query(query, args...)
|
||||||
if db.Logger != nil {
|
|
||||||
db.Logger.Info("[sql]", query, args)
|
|
||||||
}
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
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) {
|
func (db *sqlite3) GetColumns(tableName string) ([]string, map[string]*core.Column, error) {
|
||||||
args := []interface{}{tableName}
|
args := []interface{}{tableName}
|
||||||
s := "SELECT sql FROM sqlite_master WHERE type='table' and name = ?"
|
s := "SELECT sql FROM sqlite_master WHERE type='table' and name = ?"
|
||||||
|
db.LogSQL(s, args)
|
||||||
rows, err := db.DB().Query(s, args...)
|
rows, err := db.DB().Query(s, args...)
|
||||||
if db.Logger != nil {
|
|
||||||
db.Logger.Info("[sql]", s, args)
|
|
||||||
}
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
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) {
|
func (db *sqlite3) GetTables() ([]*core.Table, error) {
|
||||||
args := []interface{}{}
|
args := []interface{}{}
|
||||||
s := "SELECT name FROM sqlite_master WHERE type='table'"
|
s := "SELECT name FROM sqlite_master WHERE type='table'"
|
||||||
|
db.LogSQL(s, args)
|
||||||
|
|
||||||
rows, err := db.DB().Query(s, args...)
|
rows, err := db.DB().Query(s, args...)
|
||||||
if db.Logger != nil {
|
|
||||||
db.Logger.Info("[sql]", s, args)
|
|
||||||
}
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
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) {
|
func (db *sqlite3) GetIndexes(tableName string) (map[string]*core.Index, error) {
|
||||||
args := []interface{}{tableName}
|
args := []interface{}{tableName}
|
||||||
s := "SELECT sql FROM sqlite_master WHERE type='index' and tbl_name = ?"
|
s := "SELECT sql FROM sqlite_master WHERE type='index' and tbl_name = ?"
|
||||||
|
db.LogSQL(s, args)
|
||||||
|
|
||||||
rows, err := db.DB().Query(s, args...)
|
rows, err := db.DB().Query(s, args...)
|
||||||
if db.Logger != nil {
|
|
||||||
db.Logger.Info("[sql]", s, args)
|
|
||||||
}
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
6
xorm.go
6
xorm.go
|
@ -17,7 +17,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
Version string = "0.4.5.0204"
|
Version string = "0.5.0.0216"
|
||||||
)
|
)
|
||||||
|
|
||||||
func regDrvsNDialects() bool {
|
func regDrvsNDialects() bool {
|
||||||
|
@ -84,12 +84,10 @@ func NewEngine(driverName string, dataSourceName string) (*Engine, error) {
|
||||||
Tables: make(map[reflect.Type]*core.Table),
|
Tables: make(map[reflect.Type]*core.Table),
|
||||||
mutex: &sync.RWMutex{},
|
mutex: &sync.RWMutex{},
|
||||||
TagIdentifier: "xorm",
|
TagIdentifier: "xorm",
|
||||||
Logger: NewSimpleLogger(os.Stdout),
|
|
||||||
TZLocation: time.Local,
|
TZLocation: time.Local,
|
||||||
}
|
}
|
||||||
|
|
||||||
engine.dialect.SetLogger(engine.Logger)
|
engine.SetLogger(NewSimpleLogger(os.Stdout))
|
||||||
|
|
||||||
engine.SetMapper(core.NewCacheMapper(new(core.SnakeMapper)))
|
engine.SetMapper(core.NewCacheMapper(new(core.SnakeMapper)))
|
||||||
|
|
||||||
runtime.SetFinalizer(engine, close)
|
runtime.SetFinalizer(engine, close)
|
||||||
|
|
Loading…
Reference in New Issue