How write effective save and update function in beego?

668 Views Asked by At

I have the following function in the BaseModel that I can use anywhere.

func (d *Dummy) Save() (int64, error) {
    o := orm.NewOrm()
    var err error
    var count int64
    if d.Id == 0 {
        count, err = o.Insert(d)
    } else {
        count, err = o.Update(d)
    }

    return count, err
}

I am using like this

d := models.Dummy{Id: 10}
d.SomeValue = "x"
d.Save()

The problem is I have "d.OtherValue" is already in DB with value. After executing this function it's getting updated to 0.
As it is a common model function effective for all models, How can I solve this? Basically, I wanted to do this in a single query just like update/Save Django ORM

1

There are 1 best solutions below

0
On

You need to load the record first. You are missing the Read(&struct) ORM method:

o := orm.NewOrm()
d := models.Dummy{Id: 10}

readErr:= o.Read(&d)

// check if the record with Id of 10 exists and update...
if readErr!= o.ErrNoRows {
    if rowsAffected, err := o.Update(&d); err == nil {
        // record updated (rowsAffected indicates the number of affected rows)
    }
} else {
    // record does not exist, create a new one
    id, insertErr:= o.Insert(&d)
    if insertErr== nil {
        // success
    }
}
     

Then you should check if a record is found by the ORM

For more details you can refer to the Read and Update methods.