第14节 模型

1简单的orm模型

1.1主文件设置

package main
import (
    _ "garden/routers"
    "github.com/astaxie/beego"
    _ "garden/controllers"
    "github.com/astaxie/beego/orm"
    _ "github.com/go-sql-driver/mysql"
)

# 初始化,会在main函数执行前自动执行
func init() {
    orm.RegisterDriver("mysql", orm.DRMySQL)
    orm.RegisterDataBase("default", "mysql", "root:123456@tcp(localhost:3306)/garden?charset=utf8")
}

func main() {
    beego.Run()
}

1.2模型文件设置

在每一个model文件中都需要写初始化方法,将结构体注册到orm的model上

package models
import "github.com/astaxie/beego/orm"
type User struct {
    Id int
    Name string
    Age int
    Addr string
}
# 初始化方法
func init(){
    orm.RegisterModel(new(User))
}

1.3控制器设置

package controllers

import (
    "github.com/astaxie/beego"
    "github.com/astaxie/beego/orm"
    "fmt"
    "garden/models"
)

type AccountController struct {
    beego.Controller
}

func (a *AccountController) Get() {
    # 创建一个orm对象
    o := orm.NewOrm()
    //使用默认数据库链接,不指定则使用默认的(指定数据库)
    o.Using("default")
    # 创建一个user对象
    user := models.User{Name: "账户", Age: 18, Addr: "南充市"}
    fmt.Println(user)
    # 将创建的用户对象写入数据库,返回写入数据的id及err
    id, err := o.Insert(&user)
    fmt.Println(err)
    fmt.Println(id)

    a.Data["json"] = map[string]string{"name":"wang","type":"book"}
    a.ServeJSON()
}

1.4模型文件表名设置

模型会自动将结构体名的首大写字母转换为小写,第二个大写字母转换为下划线及小写,原结构体中的下划线保留。如User->user,AuthUser->auth_user,DBAuth_User->d_b_auth__user。
除此之外,还可以自定义表名映射,如下将User映射为自定义的表名sys_user
如果需要自定义列名映射,则在结构体字段后加orm:"column(username)",就可以将Name字段映射为username列
orm:"-"表示忽略,如下写入数据的时候会忽略id字段
Id int orm:"pk" 表示将id设置为主键

package models
import "github.com/astaxie/beego/orm"
type User struct {
    Id int  `orm:"-"`
    Name string `orm:"column(username)"`
    Age int
    Addr string
}
func (u *User) TableName() string {
    return "sys_user"
}
func init(){
    orm.RegisterModel(new(User))
}

1.5批量写入数据

使用o.InsertMulti(100, users)批量写入数据,100表示最多允许写入的数据条数。users表示写入的数组/切片,可以传入指针类型的(&users),也可以传入值本身users。返回两个值,第一个表示写入的数据条数,第二个表示错误信息。
与多数据写入不同的是,单个数据写入 o.Insert(&user)必须传入指针类型变量。返回两个值,一个是写入数据的id,另外一个是错误信息。

package controllers

import (
    "github.com/astaxie/beego"
    "github.com/astaxie/beego/orm"
    "fmt"
    "garden/models"
)

type AccountController struct {
    beego.Controller
}

func (a *AccountController) Get() {
    o := orm.NewOrm()
    //使用默认数据库链接,不指定则使用默认的
    o.Using("default")
    user := models.User{Name: "账户", Age: 18, Addr: "南充市"}
    fmt.Println(user)
    id, err := o.Insert(&user)
    fmt.Println(err)
    fmt.Println(id)
    users := []models.User{{Name: "账户1", Age: 19, Addr: "南充市"},
        {Name: "账户2", Age: 20, Addr: "南充市"},
        {Name: "账户3", Age: 21, Addr: "南充市"}}
    idMul, err1 := o.InsertMulti(100, users)
    fmt.Println(err1)
    fmt.Println(idMul)

    a.Data["json"] = map[string]string{"name":"wang","type":"book"}
    a.ServeJSON()
}

2读取数据

2.1普通读取

查询数据使用Read函数,传入查询条件指针
查询默认使用id列作为条件进行查询,如果需要使用其他列,需要传入结构体字段名字。
如使用query := models.User{Id:8}id=8为条件,则直接o.Read(&query)就可以查询,而query1 := models.User{Name:"账户2"}则必须传入Name字符串,o.Read(&query1, "Name")。如果使用了多个条件,则将结构体名依次写在后面o.Read(&query2, "Name", "Age")

package controllers
import (
    "github.com/astaxie/beego"
    "github.com/astaxie/beego/orm"
    "fmt"
    "garden/models"
)
type AccountController struct {
    beego.Controller
}
func (a *AccountController) Get() {
    o := orm.NewOrm()
    //使用默认数据库链接,不指定则使用默认的
    o.Using("default")
    query := models.User{Id:8}
    o.Read(&query)
    fmt.Println(query)

    query1 := models.User{Name:"账户2"}
    o.Read(&query1, "Name")
    fmt.Println(query1)

    query2 := models.User{Name:"账户", Age:17}
    o.Read(&query2, "Name", "Age")
    fmt.Println(query2)
    a.Data["json"] = map[string]string{"name":"wang","type":"book"}
    a.ServeJSON()
}

2.2读取不到数据则创建

读取不到数据则创建使用ReadOrCreate方法,返回三个数据,第一个表示是否是新建的数据,第二个表示读取的数据id,第三个是错误信息。

query3 := models.User{Name:"刘备", Age:21, Addr:"绵阳市"}
is_new, id2, err2 := o.ReadOrCreate(&query3, "Name", "Age", "Addr")
fmt.Println(is_new)
fmt.Println(id2)
fmt.Println(err2)

2.3查询不到数据时的判断

查询数据时,使用err == orm.ErrNoRows进行判断是否是没有数据

query2 := models.User{Name:"账户", Age:17}
err4 := o.Read(&query2, "Name", "Age")
if err4 == orm.ErrNoRows{
    fmt.Println("没有查询到数据")
} else {
    fmt.Println(query2)
}

3更新数据

更新数据需要先查询出数据,然后在更新。使用o.Update(&update)进行更新,返回更新的数据条数及错误信息.
o.Update(&update)会更新所有字段的值,o.Update(&update,"Name","Age")只更新name和age字段的值。

package controllers

import (
    "github.com/astaxie/beego"
    "github.com/astaxie/beego/orm"
    "fmt"
    "garden/models"
)
type AccountController struct {
    beego.Controller
}
func (a *AccountController) Get() {
    o := orm.NewOrm()
    //使用默认数据库链接,不指定则使用默认的
    o.Using("default")
    //更新数据
    update := models.User{Id:12,Name:"账户1",Age:19, Addr:"南充市"}
    err5 := o.Read(&update)
    if err5 == nil {
        update.Name = "账户11"
        update.Age = 21
        update.Addr = "四川省"
            # 返回更新的数据条数及错误信息
        num, err6 := o.Update(&update)
        fmt.Println(num)
        fmt.Println(err6)
    }
    a.Data["json"] = map[string]string{"name":"wang","type":"book"}
    a.ServeJSON()
}

4删除数据

删除数据使用o.Delete(&del, "Name", "Age")进行删除,传入筛选条件,并传入使用的结构体字段的名字作为筛选的依据进行筛选(本处只使用Name和Age进行筛选),返回两个字段,删掉的数据条数及错误信息。

package controllers

import (
    "github.com/astaxie/beego"
    "github.com/astaxie/beego/orm"
    "fmt"
    "garden/models"
)

type AccountController struct {
    beego.Controller
}

func (a *AccountController) Get() {
    o := orm.NewOrm()
    //使用默认数据库链接,不指定则使用默认的
    o.Using("default")

    //删除数据
    del := models.User{Name:"账户3",Age:19, Addr:"南充市"}
    num7, err7 := o.Delete(&del, "Name", "Age")
    fmt.Println(num7)
    fmt.Println(err7)

    a.Data["json"] = map[string]string{"name":"wang","type":"book"}
    a.ServeJSON()
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,165评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,720评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,849评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,245评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,596评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,747评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,977评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,708评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,448评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,657评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,141评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,493评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,153评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,890评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,799评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,685评论 2 272

推荐阅读更多精彩内容