golang学习笔记16 beego orm 数据库操作

beego ORM 是一个强大的 Go 语言 ORM 框架。她的灵感主要来自 Django ORM 和 SQLAlchemy。

目前该框架仍处于开发阶段,可能发生任何导致不兼容的改动。

官方文档:https://beego.me/docs/mvc/model/overview.md

已支持数据库驱动:

以上数据库驱动均通过基本测试,但我们仍需要您的反馈。

ORM 特性:

  • 支持 Go 的所有类型存储
  • 轻松上手,采用简单的 CRUD 风格
  • 自动 Join 关联表
  • 跨数据库兼容查询
  • 允许直接使用 SQL 查询/映射
  • 严格完整的测试保证 ORM 的稳定与健壮

更多特性请在文档中自行品读。

安装 ORM:

go get github.com/astaxie/beego/orm
 简单示例:
package main

import (
"fmt"
"github.com/astaxie/beego/orm"
_ "github.com/go-sql-driver/mysql" // import your used driver
) // Model Struct
type User struct {
Id int
Name string `orm:"size(100)"`
} func init() {
// set default database
orm.RegisterDataBase("default", "mysql", "username:password@tcp(127.0.0.1:3306)/db_name?charset=utf8", 30) // register model
orm.RegisterModel(new(User)) // create table
orm.RunSyncdb("default", false, true)
} func main() {
o := orm.NewOrm() user := User{Name: "slene"} // insert
id, err := o.Insert(&user)
fmt.Printf("ID: %d, ERR: %v\n", id, err) // update
user.Name = "astaxie"
num, err := o.Update(&user)
fmt.Printf("NUM: %d, ERR: %v\n", num, err) // read one
u := User{Id: user.Id}
err = o.Read(&u)
fmt.Printf("ERR: %v\n", err) // delete
num, err = o.Delete(&u)
fmt.Printf("NUM: %d, ERR: %v\n", num, err)
}

  关联查询

type Post struct {
Id int `orm:"auto"`
Title string `orm:"size(100)"`
User *User `orm:"rel(fk)"`
} var posts []*Post
qs := o.QueryTable("post")
num, err := qs.Filter("User__Name", "slene").All(&posts)

  SQL 查询

当您无法使用 ORM 来达到您的需求时,也可以直接使用 SQL 来完成查询/映射操作。

var maps []orm.Params
num, err := o.Raw("SELECT * FROM user").Values(&maps)
for _,term := range maps{
fmt.Println(term["id"],":",term["name"])
}

  事务处理

o.Begin()
...
user := User{Name: "slene"}
id, err := o.Insert(&user)
if err == nil {
o.Commit()
} else {
o.Rollback()
}

  在开发环境下,您可以使用以下指令来开启查询调试模式:

func main() {
orm.Debug = true
...

  

开启后将会输出所有查询语句,包括执行、准备、事务等。

例如:

[ORM] - 2013-08-09 13:18:16 - [Queries/default] - [    db.Exec /     0.4ms] -   [INSERT INTO `user` (`name`) VALUES (?)] - `slene`
...

注意:我们不建议您在部署产品后这样做。

 实战例子:
model部分
// UpdateUser updates User by Id and returns error if
// the record to be updated doesn't exist
func UpdateUserById(m *User) (err error) {
o := orm.NewOrm()
v := User{Id: m.Id}
// ascertain id exists in the database
if err = o.Read(&v); err == nil {
var num int64
if num, err = o.Update(m); err == nil {
fmt.Println("Number of records updated in database:", num)
}
}
return
} // GetUserByEmailOrMobileAndPassword
func GetUserByEmailOrMobileAndPassword(email string, password string) (maps []orm.Params, err error) {
//orm.Debug = true
o := orm.NewOrm()
//var maps []orm.Params
num, err := o.Raw("select * FROM user WHERE step>0 and (email=? or mobile=?) and password=? ", email, email,password).Values(&maps)
//beego.Debug("row nums: ", num)
if err == nil && num > 0 {
return maps, nil
}
return nil, err
} // GetUserByEmail
func GetUserByEmail(email string) (maps []orm.Params, err error) {
o := orm.NewOrm()
//var maps []orm.Params
var num int64
num, err = o.Raw("select * FROM user WHERE email=? ", email).Values(&maps)
if err == nil && num > 0 {
//fmt.Println("maps:", maps[0])
return maps, nil
}
return nil, err
} // UpdateUser step
func UpdateUserStepById(m *User) (err error) {
//orm.Debug = true
o := orm.NewOrm()
v := User{Id: m.Id}
// ascertain id exists in the database
if err = o.Read(&v); err == nil {
var num int64
if num, err = o.Update(m,"Step", "UpdateTime"); err == nil {
fmt.Println("Number of records updated in database:", num)
}
}
return
}

  Control部分(maps []orm.Params 返回的map是个interface对象,需要对里面的值做强制转换才能使用)

type RegisterReq struct {
Email string
Password string
} // @Title Register
// @Description Register User
// @Param body body controllers.RegisterReq true "body for User register"
// @Success 201 {int} models.User
// @Failure 403 body is empty
// @router /register [post]
func (c *UserController) Register() {
var v RegisterReq
if err := json.Unmarshal(c.Ctx.Input.RequestBody, &v); err == nil {
md5pwd := c.GetMd5String(v.Password + beego.AppConfig.String("MD5_SALT"))
var u models.User
u.Email = v.Email
u.Password = md5pwd
u.Step = 0
u.Status = 0
u.Level = 0
u.Role = 0
u.Nickname = strings.Split(v.Email, "@")[0]
u.CreateTime = time.Now()
u.UpdateTime = time.Now()
if _, err := models.AddUser(&u); err == nil {
//c.Ctx.Output.SetStatus(201)
c.Data["json"] = u
utils.SendmailForVerify(v.Email)
} else {
//"Error 1062: Duplicate entry 'xxx' for key 'email'"
c.Data["json"] = err.Error()
}
} else {
c.Data["json"] = err.Error()
}
c.ServeJSON()
} type LoginReq struct {
LoginId string `description:"Email or Phone"`
Password string
} // @Title Login
// @Description Login
// @Param body body controllers.LoginReq true "body for User login"
// @Success 201 {int} models.User
// @Failure 403 body is empty
// @router /login [post]
func (c *UserController) Login() {
var v LoginReq
if err := json.Unmarshal(c.Ctx.Input.RequestBody, &v); err == nil {
md5pwd := c.GetMd5String(v.Password + beego.AppConfig.String("MD5_SALT"))
user, _ := models.GetUserByEmailOrMobileAndPassword(v.LoginId,md5pwd)
if user != nil {
// get token uid nickname
id, _ := strconv.Atoi(user[0]["id"].(string))
nickname := user[0]["nickname"].(string)
tokenString := utils.GetToken(id, v.LoginId, nickname)
c.Data["json"] = map[string]interface{}{"success": 0, "msg": "登录成功","token":tokenString,"email":v.LoginId,"nickname":nickname,"id":id}
} else {
c.Data["json"] = map[string]interface{}{"success": -1, "msg": "账号密码不对或邮箱未验证激活"}
}
} else {
c.Data["json"] = err.Error()
}
c.ServeJSON()
} type ChangePasswordReq struct {
OldPassword string
NewPassword string
} // @Title Change Password
// @Description Change Password
// @Security mySecurityApiKey
// @Param body body controllers.ChangePasswordReq true "body for Change Password"
// @Success 201 {int} models.User
// @Failure 403 body is empty
// @router /change_password [put]
func (c *UserController) ChangePassword() {
email := c.GetUserMailByToken()
var v ChangePasswordReq
if err := json.Unmarshal(c.Ctx.Input.RequestBody, &v); err == nil {
md5pwd := c.GetMd5String(v.OldPassword + beego.AppConfig.String("MD5_SALT"))
user, _ := models.GetUserByEmailOrMobileAndPassword(email, md5pwd)
if user != nil {
u, _ := models.GetUserByFilter("email", email)
u.Password = c.GetMd5String(v.NewPassword + beego.AppConfig.String("MD5_SALT"))
models.UpdateUserById(u)
c.Data["json"] = Response{0, "success.", nil}
} else {
c.Data["json"] = map[string]interface{}{"success": -1, "msg": "账号密码不对"}
}
} else {
c.Data["json"] = err.Error()
}
c.ServeJSON()
} // Put ...
// @Title Put
// @Description update the User
// @Param id path string true "The id you want to update"
// @Param body body models.User true "body for User content"
// @Success 200 {object} models.User
// @Failure 403 :id is not int
// @router /:id [put]
func (c *UserController) Put() {
idStr := c.Ctx.Input.Param(":id")
id, _ := strconv.Atoi(idStr)
v := models.User{Id: id}
if err := json.Unmarshal(c.Ctx.Input.RequestBody, &v); err == nil {
if err := models.UpdateUserById(&v); err == nil {
c.Data["json"] = "OK"
} else {
c.Data["json"] = err.Error()
}
} else {
c.Data["json"] = err.Error()
}
c.ServeJSON()
} // @Title Get user profile
// @Description get user profile
// @Security mySecurityApiKey
// @Success 200 {object} models.User
// @router /profile [get]
func (c *UserController) Profile() {
uid := c.GetUserIdByToken()
v, err := models.GetUserById(uid)
if err != nil {
c.Data["json"] = err.Error()
} else {
c.Data["json"] = v
}
c.ServeJSON()
} // Get Funds ...
// @Get My Funds
// @Security mySecurityApiKey
// @Description get my Funds
// @Success 200 {object} []models.Fund
// @Failure 403
// @router /funds [get]
func (c *UserController) Funds() {
uid := int(c.GetUserIdByToken())
fund, _ := models.GetAllAccountByUserId(uid)
c.Data["json"] = fund
c.ServeJSON()
}

  

golang学习笔记16 beego orm 数据库操作的更多相关文章

  1. golang学习笔记8 beego参数配置 打包linux命令

    golang学习笔记8 beego参数配置 打包linux命令 参数配置 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/docs/mvc/contro ...

  2. golang学习笔记12 beego table name `xxx` repeat register, must be unique 错误问题

    golang学习笔记12 beego table name `xxx` repeat register, must be unique 错误问题 今天测试了重新建一个项目生成新的表,然后复制到旧的项目 ...

  3. golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息

    golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放 ...

  4. golang学习笔记9 beego nginx 部署 nginx 反向代理 golang web

    golang学习笔记9 beego nginx 部署 nginx 反向代理 golang web Nginx 部署 - beego: 简约 & 强大并存的 Go 应用框架https://bee ...

  5. golang学习笔记6 beego项目路由设置

    golang学习笔记5 beego项目路由设置 前面我们已经创建了 beego 项目,而且我们也看到它已经运行起来了,那么是如何运行起来的呢?让我们从入口文件先分析起来吧: package main ...

  6. Django 2.0 学习(14):Django ORM 数据库操作(上)

    Django ORM 数据库操作(上) ORM介绍 映射关系: 数据库表名 ---------->类名:数据库字段 ---------->类属性:数据库表一行数据 ----------&g ...

  7. Android学习笔记(十七)——数据库操作(下)

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 这一次我们来试一试升级数据库,并进行数据库的CRUD操作,其中, C 代表添加(Create) ,R 代表查询 ...

  8. Django学习笔记之Django ORM相关操作

    一般操作 详细请参考官方文档 必知必会13条 <> all(): 查询所有结果 <> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <> ...

  9. Hibernate学习笔记三:常用数据库操作语句

    转载请注明原文地址: 一:HQL 1:HQL语句格式:select from POJO类名 where 条件表达式 group by 属性 having 聚集函数 order by 属性 [其中,fr ...

随机推荐

  1. python-面向对象-12_模块和包

    模块和包 目标 模块 包 发布模块 01. 模块 1.1 模块的概念 模块是 Python 程序架构的一个核心概念 每一个以扩展名 py 结尾的 Python 源代码文件都是一个 模块 模块名 同样也 ...

  2. (1.9)SQL优化——mysql导入导出优化

    (1.9)SQL优化——mysql导入导出优化 1.大批量插入数据 [1.1]MyISAM: (1)如果存在表且有数据,插入前先关闭所有非唯一索引. (2)如果表是空的,默认就是先导入数据再创建索引, ...

  3. Redis入门到高可用(六)—— 字符串

    一.结构和命令 1.字符串键值结构 key是字符串,value可以是字符串.数字.二进制.json等: redis的key和string类型value限制均为512MB. 2.使用场景 ♦️ 缓存 ♦ ...

  4. Oracle(2)之多表查询&子查询&集合运算

    多表查询 笛卡尔积 同时查询多张表时,每张表的每条数据都要和其它表的每条数据做组合.如下栗子,我们发现产生的总记录数是 56 条,还发现 emp 表是 14 条,dept 表是 4 条,56 条正是 ...

  5. git命令操作的时候,出现中文名显示问题

    方法一:git config --global core.quotepath false 方法二: Windows系统的Git默认是不支持中文显示的,需要进行一系列的设置才能避免乱码的出现,下面总结如 ...

  6. react +webpack 配置px2rem

    项目背景需要适配ipad 以及手机端,这时候当然要告别刀耕火种时代啦(自己算rem),因为已经有成熟的工具啦,即px2rem(https://www.npmjs.com/package/px2rem) ...

  7. docker知识点

    1  安装 http://www.runoob.com/docker/centos-docker-install.html 2  dockerhub官网找到 emqttd 执行 docker pull ...

  8. mybatis test条件判断 如何引用 传入的 list参数中的map中的值

    <select id="query" resultType="map"> select * from ${tbName} <where> ...

  9. CentOS6.5安装zookeeper-3.4.5(单机)

    1.下载 下载链接:http://archive.apache.org/dist/zookeeper/ 本文下载版本:zookeeper-3.4.5.tar.gz 2.安装 安装目录:/usr/loc ...

  10. 工具方法 获取远程IP

    java-code: public String getRemoteIP(HttpServletRequest request) { String clientIp = request.getHead ...