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()
}