前言:在操作过程中,遇到的错误,如果有如下错误提示的
1、needs a primary key field, default is to use 'id' if not set。这个提示说:需要一个主键字段,如果没有设置,默认使用'id'。
解决方法:在模型的主键字段后面加上:`orm:"column(user_id);pk"` 即可。user_id(换成你自己表的主键名称)
第一步:执行如下命令
go get -u github.com/astaxie/beego/orm
第二步:执行如下命令
go get -u github.com/go-sql-driver/mysql
第三步:连接MySQL之前的准备
beego必须注册一个别名为default的数据库,作为默认使用。
orm.RegisterDataBase("default", "mysql", "test:123456@/test?charset=utf8",30,30)
第一个参数是数据库的别名,用来切换数据库使用。
第二个是driverName,在RegisterDriver时注册的
第三是数据库连接字符串:test:123456@/test?charset=utf8相对于用户名:密码@数据库地址+名称?字符集
第四个参数相当于:
orm.SetMaxIdleConns(“default”, 30)
设置数据库的最大空闲连接。
第五个参数相当于:
orm.SetMaxOpenConns(“default”, 30)
设置数据库的最大数据库连接。
第四个参数和第五个参数也可以不传值,会使用数据库默认值
新建一个数据表,数据表如下:
新建一个模型文件,我的模型文件是 person.go,文件内容如下:
package models
import (
"fmt"
"github.com/astaxie/beego/orm"
)
type Person struct {
UserId int `orm:"column(user_id);pk"`
Username string
Sex int
Email string
}
func init() {
// 需要在init中注册定义的model
orm.RegisterModel(new(Person))
}
func QueryUser(person *Person) []Person {
// 构造查询
var personData []Person
// 获取 QueryBuilder 对象. 需要指定数据库驱动参数。
// 第二个返回值是错误对象,在这里略过
qb, _ := orm.NewQueryBuilder("mysql")
// 构建查询对象
qb.Select("*").
From("person").
Where("user_id > ?").
Limit(10).Offset(0)
// 导出 SQL 语句
sql := qb.String()
// 执行 SQL 语句
o := orm.NewOrm()
o.Raw(sql, 0).QueryRows(&personData)
// o := orm.NewOrm()
// o.QueryTable("sysUser").Filter("phone", user.Phone).All(&userData)
fmt.Println(personData)
return personData
}
第四步:新建一个控制器,控制器内容如下:
package controllers
import (
"encoding/json"
"fmt"
"beegoApi/models"
"github.com/astaxie/beego"
)
// 定义一个结构体
type IndexController struct {
beego.Controller
}
// 定义一个函数
func (c *IndexController) Index() {
var ob models.Person
json.Unmarshal(c.Ctx.Input.RequestBody, &ob)
flag := models.QueryUser(&ob) // 调用models中的QueryUser方法
fmt.Print(flag)
c.Data["json"] = flag
c.ServeJSON()
}
第五步:访问路由,看一下是否成功:
routers.go文件内容如下:
// @APIVersion 1.0.0
package routers
import (
"beegoApi/controllers"
"github.com/astaxie/beego"
)
func init() {
ns := beego.NewNamespace("/v1",
beego.NSRouter("/index", &controllers.IndexController{}, "*:Index"),
/*beego.NSNamespace("/object",
beego.NSInclude(
&controllers.ObjectController{},
),
),
beego.NSNamespace("/user",
beego.NSInclude(
&controllers.UserController{},
),
),
beego.NSNamespace("/index",
beego.NSInclude(
&controllers.IndexController{},
),
),*/
)
beego.AddNamespace(ns)
}