ORM CURD

o := orm.NewOrm()
1. 直接使用對象作為表名
user := new(User)
qs = o.QueryTable(user) // 返回 QuerySeter

2. FILTER
qs.Filter("id", 1) // WHERE id = 1
qs.Filter("profile__isnull", true).Filter("name", "slene")

3. LIMIT
qs.Limit(10)
// LIMIT 10
qs.Limit(10, 20)
// LIMIT 10 OFFSET 20 注意跟 SQL 反過來的
此功能可用于分頁:
num, err := o.QueryTable("store").Limit(2, 2*3).Values(&maps)
每頁(limit)兩個铭乾,獲取第四頁內(nèi)容(偏移了2*3頁)
qs.Limit(-1)
// no limit

4. GROUPBY
qs.GroupBy("id", "age")
// GROUP BY id,age

5. ORDERBY
qs.OrderBy("id", "-profile__age")
// ORDER BY id ASC, profile.age DESC

6. DISTINCT
qs.Distinct()
// SELECT DISTINCT

7. COUNT
cnt, err := o.QueryTable("user").Count() // SELECT COUNT(*) FROM USER

8. EXIST
exist := o.QueryTable("user").Filter("UserName", "Name").Exist()

9. UPDATE
依據(jù)當前查詢條件春缕,進行批量更新操作
num, err := o.QueryTable("user").Filter("name", "slene").Update(orm.Params{"name": "astaxie",})
原子操作增加字段值
// 假設(shè) user struct 里有一個 nums int 字段
num, err := o.QueryTable("user").Update(orm.Params{
    "nums": orm.ColValue(orm.ColAdd, 100),
})
// SET nums = nums + 100
ColAdd      // 加
ColMinus    // 減
ColMultiply // 乘
ColExcept   // 除

10. DELETE
依據(jù)當前查詢條件笆搓,進行批量刪除操作
num, err := o.QueryTable("user").Filter("name", "slene").Delete()
fmt.Printf("Affected Num: %s, %s", num, err)
// DELETE FROM user WHERE name = "slene"


11. PREPAREINSERT
用于一次 prepare 多次 insert 插入趣竣,以提高批量插入的速度
var users []*User
...
qs := o.QueryTable("user")
i, _ := qs.PrepareInsert()
for _, user := range users {
    id, err := i.Insert(user)
    if err == nil {
        ...
    }
}
// PREPARE INSERT INTO user (`name`, ...) VALUES (?, ...)
// EXECUTE INSERT INTO user (`name`, ...) VALUES ("slene", ...)
// EXECUTE ...
// ...
i.Close() // 別忘記關(guān)閉 statement

12. ALL
返回對應(yīng)的結(jié)果集對象
All 的參數(shù)支持 *[]Type 和 *[]*Type 兩種形式的 slice
var users []*User
num, err := o.QueryTable("user").Filter("name", "slene").All(&users)
All / Values / ValuesList / ValuesFlat 受到 Limit 的限制,默認最大行數(shù)為 1000
可以指定返回的字段:
type Post struct {
    Id      int
    Title   string
    Content string
    Status  int
}
// 只返回 Id 和 Title
var posts []Post
o.QueryTable("post").Filter("Status", 1).All(&posts, "Id", "Title")
對象的其他字段值將會是對應(yīng)類型的默認值

13. ONE
嘗試返回單條記錄
var user User
err := o.QueryTable("user").Filter("name", "slene").One(&user)
if err == orm.ErrMultiRows {
    // 多條的時候報錯
    fmt.Printf("Returned Multi Rows Not One")
}
if err == orm.ErrNoRows {
    // 沒有找到記錄
    fmt.Printf("Not row found")
}
可以指定返回的字段:
// 只返回 Id 和 Title
var post Post
o.QueryTable("post").Filter("Content__istartswith", "prefix string").One(&post, "Id", "Title")

14. VALUES
返回結(jié)果集的 key => value 值
key 為 Model 里的 Field name,value 的值 以 string 保存
var maps []orm.Params
num, err := o.QueryTable("user").Values(&maps)
if err == nil {
    fmt.Printf("Result Nums: %d\n", num)
    for _, m := range maps {
        fmt.Println(m["Id"], m["Name"])
    }
}

15. VALUESLIST
返回的每個元素值以 string 保存
var lists []orm.ParamsList
num, err := o.QueryTable("user").ValuesList(&lists)
if err == nil {
    fmt.Printf("Result Nums: %d\n", num)
    for _, row := range lists {
        fmt.Println(row)
    }
}
當然也可以指定 expr 返回指定的 Field
var lists []orm.ParamsList
num, err := o.QueryTable("user").ValuesList(&lists, "name", "profile__age")
if err == nil {
    fmt.Printf("Result Nums: %d\n", num)
    for _, row := range lists {
        fmt.Printf("Name: %s, Age: %s\m", row[0], row[1])
    }
}

16. VALUESFLAT
只返回特定的 Field 值,將結(jié)果集展開到單個 slice 里
var list orm.ParamsList
num, err := o.QueryTable("user").ValuesFlat(&list, "name")
if err == nil {
    fmt.Printf("Result Nums: %d\n", num)
    fmt.Printf("All User Names: %s", strings.Join(list, ", "))
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末狐胎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子歌馍,更是在濱河造成了極大的恐慌握巢,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件松却,死亡現(xiàn)場離奇詭異暴浦,居然都是意外死亡,警方通過查閱死者的電腦和手機晓锻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門歌焦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人砚哆,你說我怎么就攤上這事独撇。” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵纷铣,是天一觀的道長卵史。 經(jīng)常有香客問我,道長搜立,這世上最難降的妖魔是什么以躯? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮啄踊,結(jié)果婚禮上忧设,老公的妹妹穿的比我還像新娘。我一直安慰自己颠通,他們只是感情好址晕,可當我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著顿锰,像睡著了一般斩箫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上撵儿,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天,我揣著相機與錄音狐血,去河邊找鬼淀歇。 笑死,一個胖子當著我的面吹牛匈织,可吹牛的內(nèi)容都是我干的浪默。 我是一名探鬼主播,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼缀匕,長吁一口氣:“原來是場噩夢啊……” “哼纳决!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起乡小,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤阔加,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后满钟,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胜榔,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年湃番,在試婚紗的時候發(fā)現(xiàn)自己被綠了夭织。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡吠撮,死狀恐怖尊惰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤弄屡,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布题禀,位于F島的核電站,受9級特大地震影響琢岩,放射性物質(zhì)發(fā)生泄漏投剥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一担孔、第九天 我趴在偏房一處隱蔽的房頂上張望江锨。 院中可真熱鬧,春花似錦糕篇、人聲如沸啄育。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挑豌。三九已至,卻和暖如春墩崩,著一層夾襖步出監(jiān)牢的瞬間氓英,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工鹦筹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留铝阐,地道東北人。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓铐拐,卻偏偏與公主長得像徘键,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子遍蟋,可洞房花燭夜當晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內(nèi)容