gorm/CHANGELOG.md

2.4 KiB

Change Log

v1.0

Breaking Changes

  • gorm.Open return type *gorm.DB instead of gorm.DB

  • Updating will only update changed fields

    Most applications won't be affected, only when you are changing updating values in callbacks like BeforeSave, BeforeUpdate, you should use scope.SetColumn then, for example:

    func (user *User) BeforeUpdate(scope *gorm.Scope) {
      if pw, err := bcrypt.GenerateFromPassword(user.Password, 0); err == nil {
        scope.SetColumn("EncryptedPassword", pw)
        // user.EncryptedPassword = pw  // doesn't work, won't including EncryptedPassword field when updating
      }
    }
    
  • Soft delete's default querying scope will only check deleted_at IS NULL

    Before db.Find(&user) will generate querying SQL if user has DeletedAt field

    SELECT * FROM users WHERE deleted_at IS NULL OR deleted_at <= '0001-01-02'

    Now won't include blank time check <= '0001-01-02 anymore, will generat SQL like:

    SELECT * FROM users WHERE deleted_at IS NULL

    So your application's DeletedAt field should not use time.Time as data type, need to use pointer *time.Time or something like NullTime. If you are using gorm.Model, then you are good, nothing need to be change, just make sure all records using blank time for deleted_at has been set to NULL, sample migration script:

    import (
        "github.com/jinzhu/now"
    )
    
    func main() {
      var models = []interface{}{&User{}, &Image{}}
      for _, model := range models {
        db.Unscoped().Model(model).Where("deleted_at < ?", now.MustParse("0001-01-02")).Update("deleted_at", gorm.Expr("NULL"))
      }
    }
    
  • New ToDBName logic

    Before when GORM convert Struct, Field's name to db name, only those common initialisms from golint like HTTP, URI are special handled.

    So field HTTP's db name will be http not h_t_t_p, but some other initialisms like SKU that not in golint, it's db name will be s_k_u, this release fixed this, any upper case initialisms should be converted correctly.

    If your applications using some upper case initialisms which doesn't exist in golint, you need to overwrite generated column name with tag, like sql:"column:s_k_u", or alert your database's column name according to new logic