Fix insert returnning id

This commit is contained in:
Lunny Xiao 2020-03-27 17:28:31 +08:00
parent 1d97b52e30
commit cf53cb80a0
5 changed files with 37 additions and 32 deletions

View File

@ -201,25 +201,25 @@ test-oracle: test-godror
.PNONY: test-oci8 .PNONY: test-oci8
test-oci8: go-check test-oci8: go-check
$(GO) test -v -race -tags=oracle -db=oci8 -schema='$(TEST_ORACLE_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \ $(GO) test $(INTEGRATION_PACKAGES) -v -race -tags=oracle -db=oci8 -schema='$(TEST_ORACLE_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \
-conn_str="$(TEST_ORACLE_USERNAME):$(TEST_ORACLE_PASSWORD)@$(TEST_ORACLE_HOST)/$(TEST_ORACLE_DBNAME)" \ -conn_str="$(TEST_ORACLE_USERNAME):$(TEST_ORACLE_PASSWORD)@$(TEST_ORACLE_HOST)/$(TEST_ORACLE_DBNAME)" \
-coverprofile=oracle.$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic -coverprofile=oracle.$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic
.PHONY: test-oci8\#% .PHONY: test-oci8\#%
test-oci8\#%: go-check test-oci8\#%: go-check
$(GO) test -v -race -run $* -tags=oracle -db=oci8 -schema='$(TEST_PGSQL_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \ $(GO) test $(INTEGRATION_PACKAGES) -v -race -run $* -tags=oracle -db=oci8 -schema='$(TEST_PGSQL_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \
-conn_str="postgres://$(TEST_PGSQL_USERNAME):$(TEST_PGSQL_PASSWORD)@$(TEST_PGSQL_HOST)/$(TEST_PGSQL_DBNAME)" \ -conn_str="postgres://$(TEST_PGSQL_USERNAME):$(TEST_PGSQL_PASSWORD)@$(TEST_PGSQL_HOST)/$(TEST_PGSQL_DBNAME)" \
-coverprofile=oracle.$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic -coverprofile=oracle.$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic
.PHONY: test-godror .PHONY: test-godror
test-godror: go-check test-godror: go-check
$(GO) test -v -race -tags=oracle -db=godror -schema='$(TEST_ORACLE_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \ $(GO) test $(INTEGRATION_PACKAGES) -v -race -tags=oracle -db=godror -schema='$(TEST_ORACLE_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \
-conn_str="oracle://$(TEST_ORACLE_USERNAME):$(TEST_ORACLE_PASSWORD)@$(TEST_ORACLE_HOST)/$(TEST_ORACLE_DBNAME)" \ -conn_str="oracle://$(TEST_ORACLE_USERNAME):$(TEST_ORACLE_PASSWORD)@$(TEST_ORACLE_HOST)/$(TEST_ORACLE_DBNAME)" \
-coverprofile=oracle.$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic -coverprofile=oracle.$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic
.PHONY: test-godror\#% .PHONY: test-godror\#%
test-godror\#%: go-check test-godror\#%: go-check
$(GO) test -v -race -run $* -tags=oracle -db=godror -schema='$(TEST_ORACLE_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \ $(GO) test $(INTEGRATION_PACKAGES) -v -race -run $* -tags=oracle -db=godror -schema='$(TEST_ORACLE_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \
-conn_str="oracle://$(TEST_ORACLE_USERNAME):$(TEST_ORACLE_PASSWORD)@$(TEST_ORACLE_HOST)/$(TEST_ORACLE_DBNAME)" \ -conn_str="oracle://$(TEST_ORACLE_USERNAME):$(TEST_ORACLE_PASSWORD)@$(TEST_ORACLE_HOST)/$(TEST_ORACLE_DBNAME)" \
-coverprofile=oracle.$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic -coverprofile=oracle.$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic

View File

@ -4,7 +4,7 @@
// +build oracle // +build oracle
package xorm package integrations
import ( import (
_ "github.com/mattn/go-oci8" _ "github.com/mattn/go-oci8"

View File

@ -27,7 +27,7 @@ func (statement *Statement) writeInsertOutput(buf *strings.Builder, table *schem
} }
// GenInsertSQL generates insert beans SQL // GenInsertSQL generates insert beans SQL
func (statement *Statement) GenInsertSQL(colNames []string, args []interface{}) (string, []interface{}, error) { func (statement *Statement) GenInsertSQL(colNames []string, args []interface{}) (*builder.BytesWriter, error) {
var ( var (
buf = builder.NewWriter() buf = builder.NewWriter()
exprs = statement.ExprColumns exprs = statement.ExprColumns
@ -36,11 +36,11 @@ func (statement *Statement) GenInsertSQL(colNames []string, args []interface{})
) )
if _, err := buf.WriteString("INSERT INTO "); err != nil { if _, err := buf.WriteString("INSERT INTO "); err != nil {
return "", nil, err return nil, err
} }
if err := statement.dialect.Quoter().QuoteTo(buf.Builder, tableName); err != nil { if err := statement.dialect.Quoter().QuoteTo(buf.Builder, tableName); err != nil {
return "", nil, err return nil, err
} }
var hasInsertColumns = len(colNames) > 0 var hasInsertColumns = len(colNames) > 0
@ -58,19 +58,19 @@ func (statement *Statement) GenInsertSQL(colNames []string, args []interface{})
statement.dialect.URI().DBType != schemas.DAMENG { statement.dialect.URI().DBType != schemas.DAMENG {
if statement.dialect.URI().DBType == schemas.MYSQL { if statement.dialect.URI().DBType == schemas.MYSQL {
if _, err := buf.WriteString(" VALUES ()"); err != nil { if _, err := buf.WriteString(" VALUES ()"); err != nil {
return "", nil, err return nil, err
} }
} else { } else {
if err := statement.writeInsertOutput(buf.Builder, table); err != nil { if err := statement.writeInsertOutput(buf.Builder, table); err != nil {
return "", nil, err return nil, err
} }
if _, err := buf.WriteString(" DEFAULT VALUES"); err != nil { if _, err := buf.WriteString(" DEFAULT VALUES"); err != nil {
return "", nil, err return nil, err
} }
} }
} else { } else {
if _, err := buf.WriteString(" ("); err != nil { if _, err := buf.WriteString(" ("); err != nil {
return "", nil, err return nil, err
} }
if needSeq { if needSeq {
@ -82,19 +82,19 @@ func (statement *Statement) GenInsertSQL(colNames []string, args []interface{})
} }
if _, err := buf.WriteString(")"); err != nil { if _, err := buf.WriteString(")"); err != nil {
return "", nil, err return nil, err
} }
if err := statement.writeInsertOutput(buf.Builder, table); err != nil { if err := statement.writeInsertOutput(buf.Builder, table); err != nil {
return "", nil, err return nil, err
} }
if statement.Conds().IsValid() { if statement.Conds().IsValid() {
if _, err := buf.WriteString(" SELECT "); err != nil { if _, err := buf.WriteString(" SELECT "); err != nil {
return "", nil, err return nil, err
} }
if err := statement.WriteArgs(buf, args); err != nil { if err := statement.WriteArgs(buf, args); err != nil {
return "", nil, err return nil, err
} }
if needSeq { if needSeq {
@ -109,7 +109,7 @@ func (statement *Statement) GenInsertSQL(colNames []string, args []interface{})
} }
if len(exprs) > 0 { if len(exprs) > 0 {
if _, err := buf.WriteString(","); err != nil { if _, err := buf.WriteString(","); err != nil {
return "", nil, err return nil, err
} }
if err := exprs.WriteArgs(buf); err != nil { if err := exprs.WriteArgs(buf); err != nil {
return "", nil, err return "", nil, err
@ -117,27 +117,27 @@ func (statement *Statement) GenInsertSQL(colNames []string, args []interface{})
} }
if _, err := buf.WriteString(" FROM "); err != nil { if _, err := buf.WriteString(" FROM "); err != nil {
return "", nil, err return nil, err
} }
if err := statement.dialect.Quoter().QuoteTo(buf.Builder, tableName); err != nil { if err := statement.dialect.Quoter().QuoteTo(buf.Builder, tableName); err != nil {
return "", nil, err return nil, err
} }
if _, err := buf.WriteString(" WHERE "); err != nil { if _, err := buf.WriteString(" WHERE "); err != nil {
return "", nil, err return nil, err
} }
if err := statement.Conds().WriteTo(buf); err != nil { if err := statement.Conds().WriteTo(buf); err != nil {
return "", nil, err return nil, err
} }
} else { } else {
if _, err := buf.WriteString(" VALUES ("); err != nil { if _, err := buf.WriteString(" VALUES ("); err != nil {
return "", nil, err return nil, err
} }
if err := statement.WriteArgs(buf, args); err != nil { if err := statement.WriteArgs(buf, args); err != nil {
return "", nil, err return nil, err
} }
// Insert tablename (id) Values(seq_tablename.nextval) // Insert tablename (id) Values(seq_tablename.nextval)
@ -154,30 +154,31 @@ func (statement *Statement) GenInsertSQL(colNames []string, args []interface{})
if len(exprs) > 0 { if len(exprs) > 0 {
if _, err := buf.WriteString(","); err != nil { if _, err := buf.WriteString(","); err != nil {
return "", nil, err return nil, err
} }
} }
if err := exprs.WriteArgs(buf); err != nil { if err := exprs.WriteArgs(buf); err != nil {
return "", nil, err return nil, err
} }
if _, err := buf.WriteString(")"); err != nil { if _, err := buf.WriteString(")"); err != nil {
return "", nil, err return nil, err
} }
} }
} }
if len(table.AutoIncrement) > 0 && statement.dialect.URI().DBType == schemas.POSTGRES { if len(table.AutoIncrement) > 0 && (statement.dialect.URI().DBType == schemas.POSTGRES ||
statement.dialect.URI().DBType == schemas.ORACLE) {
if _, err := buf.WriteString(" RETURNING "); err != nil { if _, err := buf.WriteString(" RETURNING "); err != nil {
return "", nil, err return nil, err
} }
if err := statement.dialect.Quoter().QuoteTo(buf.Builder, table.AutoIncrement); err != nil { if err := statement.dialect.Quoter().QuoteTo(buf.Builder, table.AutoIncrement); err != nil {
return "", nil, err return nil, err
} }
} }
return buf.String(), buf.Args(), nil return buf, nil
} }
// GenInsertMapSQL generates insert map SQL // GenInsertMapSQL generates insert map SQL

View File

@ -91,6 +91,10 @@ func NewStatement(dialect dialects.Dialect, tagParser *tags.Parser, defaultTimeZ
return statement return statement
} }
func (statement *Statement) Dialect() dialects.Dialect {
return statement.dialect
}
// SetTableName set table name // SetTableName set table name
func (statement *Statement) SetTableName(tableName string) { func (statement *Statement) SetTableName(tableName string) {
statement.tableName = tableName statement.tableName = tableName

View File

@ -280,7 +280,7 @@ func (session *Session) insertStruct(bean interface{}) (int64, error) {
return 0, err return 0, err
} }
sqlStr, args, err := session.statement.GenInsertSQL(colNames, args) buf, err := session.statement.GenInsertSQL(colNames, args)
if err != nil { if err != nil {
return 0, err return 0, err
} }
@ -384,7 +384,7 @@ func (session *Session) insertStruct(bean interface{}) (int64, error) {
return 1, convert.AssignValue(*aiValue, id) return 1, convert.AssignValue(*aiValue, id)
} }
res, err := session.exec(sqlStr, args...) res, err := session.exec(buf.String(), buf.Args()...)
if err != nil { if err != nil {
return 0, err return 0, err
} }