func DoTestUpdate(assert *assrt.Assert, info dialectInfo) { mg, q := setupDb(assert, info) mg.dropTableIfExists(&basic{}) mg.CreateTableIfNotExists(&basic{}) _, err := q.Save(&basic{Name: "a", State: 1}) _, err = q.Save(&basic{Name: "b", State: 1}) _, err = q.Save(&basic{Name: "c", State: 0}) assert.MustNil(err) { // define a temporary struct in a block to update partial columns of a table // as the type is in a block, so it will not conflict with other types with the same name in the same method type basic struct { Name string } affected, err := q.Where("state = ?", 1).Update(&basic{Name: "d"}) assert.MustNil(err) assert.Equal(2, affected) var datas []*basic q.Where("state = ?", 1).FindAll(&datas) assert.MustEqual(2, len(datas)) assert.Equal("d", datas[0].Name) assert.Equal("d", datas[1].Name) } // if choose basic table type to update, all zero value in the struct will be updated too. // this may be cause problems, so define a temporary struct to update table is the recommended way. affected, err := q.Where("state = ?", 1).Update(&basic{Name: "e"}) assert.MustNil(err) assert.Equal(2, affected) var datas []*basic q.Where("state = ?", 1).FindAll(&datas) assert.MustEqual(0, len(datas)) }
func DoTestSaveAndDelete(assert *assrt.Assert, info dialectInfo) { x := time.Now() assert.MustZero(x.Sub(x.UTC())) now := time.Now() mg, q := setupDb(assert, info) type saveModel struct { Id Id A string B int Updated time.Time Created time.Time } model1 := saveModel{ A: "banana", B: 5, } model2 := saveModel{ A: "orange", B: 4, } mg.dropTableIfExists(&model1) mg.CreateTableIfNotExists(&model1) affected, err := q.Save(&model1) assert.MustNil(err) assert.Equal(1, affected) assert.True(model1.Created.Sub(now) > 0) assert.True(model1.Updated.Sub(now) > 0) // make sure created/updated values match the db var model1r []*saveModel err = q.Where("id = ?", model1.Id).FindAll(&model1r) assert.MustNil(err) assert.MustOneLen(model1r) assert.Equal(model1.Created.Unix(), model1r[0].Created.Unix()) assert.Equal(model1.Updated.Unix(), model1r[0].Updated.Unix()) oldCreate := model1.Created oldUpdate := model1.Updated model1.A = "grape" model1.B = 9 time.Sleep(time.Second * 1) // sleep for 1 sec affected, err = q.Save(&model1) assert.MustNil(err) assert.MustEqual(1, affected) assert.True(model1.Created.Equal(oldCreate)) assert.True(model1.Updated.Sub(oldUpdate) > 0) // make sure created/updated values match the db var model1r2 []*saveModel err = q.Where("id = ?", model1.Id).FindAll(&model1r2) assert.MustNil(err) assert.MustOneLen(model1r2) assert.True(model1r2[0].Updated.Sub(model1r2[0].Created) >= 1) assert.Equal(model1.Created.Unix(), model1r2[0].Created.Unix()) assert.Equal(model1.Updated.Unix(), model1r2[0].Updated.Unix()) affected, err = q.Save(&model2) assert.MustNil(err) assert.Equal(1, affected) affected, err = q.Delete(&model2) assert.MustNil(err) assert.Equal(1, affected) }