callback_create.go 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package gorm
  2. import (
  3. "fmt"
  4. "strings"
  5. )
  6. func BeforeCreate(scope *Scope) {
  7. scope.CallMethod("BeforeSave")
  8. scope.CallMethod("BeforeCreate")
  9. }
  10. func UpdateTimeStampWhenCreate(scope *Scope) {
  11. if !scope.HasError() {
  12. now := NowFunc()
  13. scope.SetColumn("CreatedAt", now)
  14. scope.SetColumn("UpdatedAt", now)
  15. }
  16. }
  17. func Create(scope *Scope) {
  18. defer scope.Trace(NowFunc())
  19. if !scope.HasError() {
  20. // set create sql
  21. var sqls, columns []string
  22. for _, field := range scope.Fields() {
  23. if field.IsNormal && (!field.IsPrimaryKey || !scope.PrimaryKeyZero()) {
  24. if field.DefaultValue != nil && field.IsBlank {
  25. continue
  26. }
  27. columns = append(columns, scope.Quote(field.DBName))
  28. sqls = append(sqls, scope.AddToVars(field.Field.Interface()))
  29. }
  30. }
  31. returningKey := "*"
  32. if scope.PrimaryKey() != "" {
  33. returningKey = scope.PrimaryKey()
  34. }
  35. if len(columns) == 0 {
  36. scope.Raw(fmt.Sprintf("INSERT INTO %v DEFAULT VALUES %v",
  37. scope.QuotedTableName(),
  38. scope.Dialect().ReturningStr(scope.TableName(), returningKey),
  39. ))
  40. } else {
  41. scope.Raw(fmt.Sprintf(
  42. "INSERT INTO %v (%v) VALUES (%v) %v",
  43. scope.QuotedTableName(),
  44. strings.Join(columns, ","),
  45. strings.Join(sqls, ","),
  46. scope.Dialect().ReturningStr(scope.TableName(), returningKey),
  47. ))
  48. }
  49. // execute create sql
  50. var id interface{}
  51. if scope.Dialect().SupportLastInsertId() {
  52. if result, err := scope.DB().Exec(scope.Sql, scope.SqlVars...); scope.Err(err) == nil {
  53. id, err = result.LastInsertId()
  54. if scope.Err(err) == nil {
  55. scope.db.RowsAffected, _ = result.RowsAffected()
  56. }
  57. }
  58. } else {
  59. if scope.PrimaryKey() == "" {
  60. if results, err := scope.DB().Exec(scope.Sql, scope.SqlVars...); err != nil {
  61. scope.db.RowsAffected, _ = results.RowsAffected()
  62. }
  63. } else {
  64. if scope.Err(scope.DB().QueryRow(scope.Sql, scope.SqlVars...).Scan(&id)) == nil {
  65. scope.db.RowsAffected = 1
  66. }
  67. }
  68. }
  69. if scope.PrimaryKey() != "" && !scope.HasError() && scope.PrimaryKeyZero() {
  70. scope.SetColumn(scope.PrimaryKey(), id)
  71. }
  72. }
  73. }
  74. func AfterCreate(scope *Scope) {
  75. scope.CallMethod("AfterCreate")
  76. scope.CallMethod("AfterSave")
  77. }
  78. func init() {
  79. DefaultCallback.Create().Register("gorm:begin_transaction", BeginTransaction)
  80. DefaultCallback.Create().Register("gorm:before_create", BeforeCreate)
  81. DefaultCallback.Create().Register("gorm:save_before_associations", SaveBeforeAssociations)
  82. DefaultCallback.Create().Register("gorm:update_time_stamp_when_create", UpdateTimeStampWhenCreate)
  83. DefaultCallback.Create().Register("gorm:create", Create)
  84. DefaultCallback.Create().Register("gorm:save_after_associations", SaveAfterAssociations)
  85. DefaultCallback.Create().Register("gorm:after_create", AfterCreate)
  86. DefaultCallback.Create().Register("gorm:commit_or_rollback_transaction", CommitOrRollbackTransaction)
  87. }