diff --git a/database/gdb/gdb.go b/database/gdb/gdb.go index 8421900d5..138eb65b8 100644 --- a/database/gdb/gdb.go +++ b/database/gdb/gdb.go @@ -84,6 +84,7 @@ type DB interface { Insert(table string, data interface{}, batch ...int) (sql.Result, error) // See Core.Insert. InsertIgnore(table string, data interface{}, batch ...int) (sql.Result, error) // See Core.InsertIgnore. + InsertAndGetId(table string, data interface{}, batch ...int) (int64, error) // See Core.InsertAndGetId. Replace(table string, data interface{}, batch ...int) (sql.Result, error) // See Core.Replace. Save(table string, data interface{}, batch ...int) (sql.Result, error) // See Core.Save. diff --git a/database/gdb/gdb_core.go b/database/gdb/gdb_core.go index 099ada0c3..1b6d36ee8 100644 --- a/database/gdb/gdb_core.go +++ b/database/gdb/gdb_core.go @@ -11,11 +11,12 @@ import ( "context" "database/sql" "fmt" - "github.com/gogf/gf/errors/gerror" - "github.com/gogf/gf/text/gstr" "reflect" "strings" + "github.com/gogf/gf/errors/gerror" + "github.com/gogf/gf/text/gstr" + "github.com/gogf/gf/internal/utils" "github.com/gogf/gf/container/gvar" @@ -387,15 +388,34 @@ func (c *Core) Begin() (*TX, error) { // ctx, cancelFunc = context.WithTimeout(ctx, c.GetConfig().TranTimeout) // defer cancelFunc() //} - if tx, err := master.Begin(); err == nil { + var ( + sqlStr = "BEGIN" + mTime1 = gtime.TimestampMilli() + rawTx, err = master.Begin() + mTime2 = gtime.TimestampMilli() + sqlObj = &Sql{ + Sql: sqlStr, + Type: "DB.Begin", + Args: nil, + Format: sqlStr, + Error: err, + Start: mTime1, + End: mTime2, + Group: c.db.GetGroup(), + } + ) + c.db.addSqlToTracing(c.db.GetCtx(), sqlObj) + if c.db.GetDebug() { + c.db.writeSqlToLogger(sqlObj) + } + if err == nil { return &TX{ db: c.db, - tx: tx, + tx: rawTx, master: master, }, nil - } else { - return nil, err } + return nil, err } } @@ -464,6 +484,14 @@ func (c *Core) InsertIgnore(table string, data interface{}, batch ...int) (sql.R return c.Model(table).Data(data).InsertIgnore() } +// InsertAndGetId performs action Insert and returns the last insert id that automatically generated. +func (c *Core) InsertAndGetId(table string, data interface{}, batch ...int) (int64, error) { + if len(batch) > 0 { + return c.Model(table).Data(data).Batch(batch[0]).InsertAndGetId() + } + return c.Model(table).Data(data).InsertAndGetId() +} + // Replace does "REPLACE INTO ..." statement for the table. // If there's already one unique record of the data in the table, it deletes the record // and inserts a new one. diff --git a/database/gdb/gdb_z_mysql_transaction_test.go b/database/gdb/gdb_z_mysql_transaction_test.go index 264d59b47..ab1b96af3 100644 --- a/database/gdb/gdb_z_mysql_transaction_test.go +++ b/database/gdb/gdb_z_mysql_transaction_test.go @@ -8,9 +8,10 @@ package gdb_test import ( "fmt" + "testing" + "github.com/gogf/gf/database/gdb" "github.com/gogf/gf/errors/gerror" - "testing" "github.com/gogf/gf/frame/g" "github.com/gogf/gf/os/gtime" @@ -119,7 +120,7 @@ func Test_TX_Insert(t *testing.T) { if err != nil { gtest.Error(err) } - user := tx.Table(table) + user := tx.Model(table) if _, err := user.Data(g.Map{ "id": 1, "passport": "t1", @@ -129,7 +130,6 @@ func Test_TX_Insert(t *testing.T) { }).Insert(); err != nil { gtest.Error(err) } - if _, err := tx.Insert(table, g.Map{ "id": 2, "passport": "t1", @@ -140,7 +140,7 @@ func Test_TX_Insert(t *testing.T) { gtest.Error(err) } - if n, err := tx.Table(table).Count(); err != nil { + if n, err := tx.Model(table).Count(); err != nil { gtest.Error(err) } else { t.Assert(n, 2)