1. 程式人生 > >begoo——物件的CRUD操作

begoo——物件的CRUD操作

如果已知主鍵的值,那麼可以使用這些方法進行CRUD操作

對object操作的四個方法Read/Insert/Update/Delete

o := orm.NewOrm()
user := new(User)  //建立一個空物件
user.Name = "slene"  //給屬性賦值

fmt.Println(o.Insert(user))  //寫入資料庫

user.Name = "Your"
fmt.Println(o.Update(user))  //更新操作
fmt.Println(o.Read(user))  //檢視操作
fmt.Println(o.Delete(user))  //刪除操作

  

Read

o := orm.NewOrm()
user := User{Id: 1}  //建立一個結構體變數,其實就是一個物件

err := o.Read(&user)  //在資料庫中檢視該物件,理論上查詢不到

if err == orm.ErrNoRows {
    fmt.Println("查詢不到")
} else if err == orm.ErrMissPK {
    fmt.Println("找不到主鍵")
} else {
    fmt.Println(user.Id, user.Name)
}

Read預設通過主鍵賦值,可以使用指定的欄位進行查詢:

user := User{Name: "slene"}
err = o.Read(&user, "Name")
...

物件的其它欄位值將會是對應型別的預設值。

 

ReadOrCreate

嘗試從資料庫讀取,不存在的話就建立一個。

預設必須傳入一個引數作為條件欄位,同時也支援多個引數多個條件欄位

o := orm.NewOrm()
user := User{Name: "slene"}
// 三個返回引數依次為:是否新建立的,物件 Id 值,錯誤
if created, id, err := o.ReadOrCreate(&user, "Name"); err == nil {
    if created {
        fmt.Println("New Insert an object. Id:", id)
    } else {
        fmt.Println("Get an object. Id:", id)
    }
}

  

Insert

第一個返回值為自增鍵id的值

o := orm.NewOrm()
var user User
user.Name = "slene"
user.IsActive = true

id, err := o.Insert(&user)
if err == nil {
    fmt.Println(id)
}

建立後會自動對auto的field賦值。

 

InsertMulti

同時插入多個物件

類似sql語句

insert into table (name, age) values("slene", 28),("astaxie", 30),("unknown", 20)

第一個引數bulk為並列插入的數量,第二個為物件的slice,返回值為成功插入的數量。

users := []User{
    {Name: "slene"},
    {Name: "astaxie"},
    {Name: "unknown"},
    ...
}
successNums, err := o.InsertMulti(100, users)

bulk為1時,將會順序插入slice中的資料。

 

Update

第一個返回值為影響的行數(對那行做的更新)

o := orm.NewOrm()
user := User{Id: 1}
if o.Read(&user) == nil {
    user.Name = "MyName"
    if num, err := o.Update(&user); err == nil {
        fmt.Println(num)
    }
}

Update預設更新所有的欄位,可以更新指定的欄位

// 只更新 Name
o.Update(&user, "Name")
// 指定多個欄位
// o.Update(&user, "Field1", "Field2", ...)
...

  

Delete

第一個返回值為影響的行數

o := orm.NewOrm()
if num, err := o.Delete(&User{Id: 1}); err == nil {
    fmt.Println(num)
}

  

Delete操作會對反向關係進行操作,此例中Post擁有一個到User的外來鍵。刪除User的時候,如果on_delete設定為預設的級聯操作,將刪除對應的Post