From eda3b5341896ea31f25592b38fb946f39f752c1f Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Tue, 14 Apr 2020 15:19:41 +0800 Subject: [PATCH] Fix insert --- README.md | 5 +++-- dialects/oracle.go | 23 ++++++++++++++++++++++- internal/statements/insert.go | 10 +++++++--- session_insert.go | 4 +++- 4 files changed, 35 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index a15be488..5681740d 100644 --- a/README.md +++ b/README.md @@ -50,8 +50,9 @@ Drivers for Go's sql package which currently support database/sql includes: * MsSql - [github.com/denisenkom/go-mssqldb](https://github.com/denisenkom/go-mssqldb) -* Oracle - - [github.com/mattn/go-oci8](https://github.com/mattn/go-oci8) (experiment) +* Oracle (experiment) + - [github.com/mattn/go-oci8](https://github.com/mattn/go-oci8) + - [github.com/godror/godror](https://github.com/godror/godror) ## Installation diff --git a/dialects/oracle.go b/dialects/oracle.go index 0c79489f..4c6035e6 100644 --- a/dialects/oracle.go +++ b/dialects/oracle.go @@ -10,6 +10,7 @@ import ( "errors" "fmt" "net/url" + "regexp" "strconv" "strings" @@ -867,10 +868,30 @@ func (db *oracle) Filters() []Filter { type godrorDriver struct { } +func parseNoProtocol(driverName, dataSourceName string) (*URI, error) { + db := &URI{DBType: schemas.ORACLE} + dsnPattern := regexp.MustCompile( + `^(?P.*)\/(?P.*)@` + // user:password@ + `(?P.*)` + // ip:port + `\/(?P.*)`) // dbname + matches := dsnPattern.FindStringSubmatch(dataSourceName) + names := dsnPattern.SubexpNames() + for i, match := range matches { + switch names[i] { + case "dbname": + db.DBName = match + } + } + if db.DBName == "" && len(matches) != 0 { + return nil, errors.New("dbname is empty") + } + return db, nil +} + func parseOracle(driverName, dataSourceName string) (*URI, error) { var connStr = dataSourceName if !strings.HasPrefix(connStr, "oracle://") { - connStr = fmt.Sprintf("oracle://%s", connStr) + return parseNoProtocol(driverName, dataSourceName) } u, err := url.Parse(connStr) diff --git a/internal/statements/insert.go b/internal/statements/insert.go index 3ebdc07d..7e894ae2 100644 --- a/internal/statements/insert.go +++ b/internal/statements/insert.go @@ -41,7 +41,9 @@ func (statement *Statement) GenInsertSQL(colNames []string, args []interface{}) return nil, err } - if len(colNames) <= 0 { + var hasInsertColumns = len(colNames) > 0 + + if !hasInsertColumns && statement.dialect.URI().DBType != schemas.ORACLE { if statement.dialect.URI().DBType == schemas.MYSQL { if _, err := buf.WriteString(" VALUES ()"); err != nil { return nil, err @@ -118,8 +120,10 @@ func (statement *Statement) GenInsertSQL(colNames []string, args []interface{}) // Insert tablename (id) Values(seq_tablename.nextval) if len(table.AutoIncrement) > 0 && statement.dialect.URI().DBType == schemas.ORACLE { - if _, err := buf.WriteString(","); err != nil { - return nil, err + if hasInsertColumns { + if _, err := buf.WriteString(","); err != nil { + return nil, err + } } if _, err := buf.WriteString("seq_" + tableName + ".nextval"); err != nil { return nil, err diff --git a/session_insert.go b/session_insert.go index a991cac8..41f5e781 100644 --- a/session_insert.go +++ b/session_insert.go @@ -360,10 +360,12 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) { } res, err := session.queryBytes(buf.String(), buf.Args()...) - if err != nil { return 0, err } + + fmt.Println("=====", id) + defer handleAfterInsertProcessorFunc(bean) session.cacheInsert(tableName)