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:

  1. go get github.com/astaxie/beego/orm
 简单示例:
  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "github.com/astaxie/beego/orm"
  6. _ "github.com/go-sql-driver/mysql" // import your used driver
  7. )
  8.  
  9. // Model Struct
  10. type User struct {
  11. Id int
  12. Name string `orm:"size(100)"`
  13. }
  14.  
  15. func init() {
  16. // set default database
  17. orm.RegisterDataBase("default", "mysql", "username:password@tcp(127.0.0.1:3306)/db_name?charset=utf8", 30)
  18.  
  19. // register model
  20. orm.RegisterModel(new(User))
  21.  
  22. // create table
  23. orm.RunSyncdb("default", false, true)
  24. }
  25.  
  26. func main() {
  27. o := orm.NewOrm()
  28.  
  29. user := User{Name: "slene"}
  30.  
  31. // insert
  32. id, err := o.Insert(&user)
  33. fmt.Printf("ID: %d, ERR: %v\n", id, err)
  34.  
  35. // update
  36. user.Name = "astaxie"
  37. num, err := o.Update(&user)
  38. fmt.Printf("NUM: %d, ERR: %v\n", num, err)
  39.  
  40. // read one
  41. u := User{Id: user.Id}
  42. err = o.Read(&u)
  43. fmt.Printf("ERR: %v\n", err)
  44.  
  45. // delete
  46. num, err = o.Delete(&u)
  47. fmt.Printf("NUM: %d, ERR: %v\n", num, err)
  48. }

  关联查询

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

  SQL 查询

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

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

  事务处理

  1. o.Begin()
  2. ...
  3. user := User{Name: "slene"}
  4. id, err := o.Insert(&user)
  5. if err == nil {
  6. o.Commit()
  7. } else {
  8. o.Rollback()
  9. }

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

  1. func main() {
  2. orm.Debug = true
  3. ...

  

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

例如:

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

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

 实战例子:
model部分
  1. // UpdateUser updates User by Id and returns error if
  2. // the record to be updated doesn't exist
  3. func UpdateUserById(m *User) (err error) {
  4. o := orm.NewOrm()
  5. v := User{Id: m.Id}
  6. // ascertain id exists in the database
  7. if err = o.Read(&v); err == nil {
  8. var num int64
  9. if num, err = o.Update(m); err == nil {
  10. fmt.Println("Number of records updated in database:", num)
  11. }
  12. }
  13. return
  14. }
  15.  
  16. // GetUserByEmailOrMobileAndPassword
  17. func GetUserByEmailOrMobileAndPassword(email string, password string) (maps []orm.Params, err error) {
  18. //orm.Debug = true
  19. o := orm.NewOrm()
  20. //var maps []orm.Params
  21. num, err := o.Raw("select * FROM user WHERE step>0 and (email=? or mobile=?) and password=? ", email, email,password).Values(&maps)
  22. //beego.Debug("row nums: ", num)
  23. if err == nil && num > 0 {
  24. return maps, nil
  25. }
  26. return nil, err
  27. }
  28.  
  29. // GetUserByEmail
  30. func GetUserByEmail(email string) (maps []orm.Params, err error) {
  31. o := orm.NewOrm()
  32. //var maps []orm.Params
  33. var num int64
  34. num, err = o.Raw("select * FROM user WHERE email=? ", email).Values(&maps)
  35. if err == nil && num > 0 {
  36. //fmt.Println("maps:", maps[0])
  37. return maps, nil
  38. }
  39. return nil, err
  40. }
  41.  
  42. // UpdateUser step
  43. func UpdateUserStepById(m *User) (err error) {
  44. //orm.Debug = true
  45. o := orm.NewOrm()
  46. v := User{Id: m.Id}
  47. // ascertain id exists in the database
  48. if err = o.Read(&v); err == nil {
  49. var num int64
  50. if num, err = o.Update(m,"Step", "UpdateTime"); err == nil {
  51. fmt.Println("Number of records updated in database:", num)
  52. }
  53. }
  54. return
  55. }

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

  1. type RegisterReq struct {
  2. Email string
  3. Password string
  4. }
  5.  
  6. // @Title Register
  7. // @Description Register User
  8. // @Param body body controllers.RegisterReq true "body for User register"
  9. // @Success 201 {int} models.User
  10. // @Failure 403 body is empty
  11. // @router /register [post]
  12. func (c *UserController) Register() {
  13. var v RegisterReq
  14. if err := json.Unmarshal(c.Ctx.Input.RequestBody, &v); err == nil {
  15. md5pwd := c.GetMd5String(v.Password + beego.AppConfig.String("MD5_SALT"))
  16. var u models.User
  17. u.Email = v.Email
  18. u.Password = md5pwd
  19. u.Step = 0
  20. u.Status = 0
  21. u.Level = 0
  22. u.Role = 0
  23. u.Nickname = strings.Split(v.Email, "@")[0]
  24. u.CreateTime = time.Now()
  25. u.UpdateTime = time.Now()
  26. if _, err := models.AddUser(&u); err == nil {
  27. //c.Ctx.Output.SetStatus(201)
  28. c.Data["json"] = u
  29. utils.SendmailForVerify(v.Email)
  30. } else {
  31. //"Error 1062: Duplicate entry 'xxx' for key 'email'"
  32. c.Data["json"] = err.Error()
  33. }
  34. } else {
  35. c.Data["json"] = err.Error()
  36. }
  37. c.ServeJSON()
  38. }
  39.  
  40. type LoginReq struct {
  41. LoginId string `description:"Email or Phone"`
  42. Password string
  43. }
  44.  
  45. // @Title Login
  46. // @Description Login
  47. // @Param body body controllers.LoginReq true "body for User login"
  48. // @Success 201 {int} models.User
  49. // @Failure 403 body is empty
  50. // @router /login [post]
  51. func (c *UserController) Login() {
  52. var v LoginReq
  53. if err := json.Unmarshal(c.Ctx.Input.RequestBody, &v); err == nil {
  54. md5pwd := c.GetMd5String(v.Password + beego.AppConfig.String("MD5_SALT"))
  55. user, _ := models.GetUserByEmailOrMobileAndPassword(v.LoginId,md5pwd)
  56. if user != nil {
  57. // get token uid nickname
  58. id, _ := strconv.Atoi(user[0]["id"].(string))
  59. nickname := user[0]["nickname"].(string)
  60. tokenString := utils.GetToken(id, v.LoginId, nickname)
  61. c.Data["json"] = map[string]interface{}{"success": 0, "msg": "登录成功","token":tokenString,"email":v.LoginId,"nickname":nickname,"id":id}
  62. } else {
  63. c.Data["json"] = map[string]interface{}{"success": -1, "msg": "账号密码不对或邮箱未验证激活"}
  64. }
  65. } else {
  66. c.Data["json"] = err.Error()
  67. }
  68. c.ServeJSON()
  69. }
  70.  
  71. type ChangePasswordReq struct {
  72. OldPassword string
  73. NewPassword string
  74. }
  75.  
  76. // @Title Change Password
  77. // @Description Change Password
  78. // @Security mySecurityApiKey
  79. // @Param body body controllers.ChangePasswordReq true "body for Change Password"
  80. // @Success 201 {int} models.User
  81. // @Failure 403 body is empty
  82. // @router /change_password [put]
  83. func (c *UserController) ChangePassword() {
  84. email := c.GetUserMailByToken()
  85. var v ChangePasswordReq
  86. if err := json.Unmarshal(c.Ctx.Input.RequestBody, &v); err == nil {
  87. md5pwd := c.GetMd5String(v.OldPassword + beego.AppConfig.String("MD5_SALT"))
  88. user, _ := models.GetUserByEmailOrMobileAndPassword(email, md5pwd)
  89. if user != nil {
  90. u, _ := models.GetUserByFilter("email", email)
  91. u.Password = c.GetMd5String(v.NewPassword + beego.AppConfig.String("MD5_SALT"))
  92. models.UpdateUserById(u)
  93. c.Data["json"] = Response{0, "success.", nil}
  94. } else {
  95. c.Data["json"] = map[string]interface{}{"success": -1, "msg": "账号密码不对"}
  96. }
  97. } else {
  98. c.Data["json"] = err.Error()
  99. }
  100. c.ServeJSON()
  101. }
  102.  
  103. // Put ...
  104. // @Title Put
  105. // @Description update the User
  106. // @Param id path string true "The id you want to update"
  107. // @Param body body models.User true "body for User content"
  108. // @Success 200 {object} models.User
  109. // @Failure 403 :id is not int
  110. // @router /:id [put]
  111. func (c *UserController) Put() {
  112. idStr := c.Ctx.Input.Param(":id")
  113. id, _ := strconv.Atoi(idStr)
  114. v := models.User{Id: id}
  115. if err := json.Unmarshal(c.Ctx.Input.RequestBody, &v); err == nil {
  116. if err := models.UpdateUserById(&v); err == nil {
  117. c.Data["json"] = "OK"
  118. } else {
  119. c.Data["json"] = err.Error()
  120. }
  121. } else {
  122. c.Data["json"] = err.Error()
  123. }
  124. c.ServeJSON()
  125. }
  126.  
  127. // @Title Get user profile
  128. // @Description get user profile
  129. // @Security mySecurityApiKey
  130. // @Success 200 {object} models.User
  131. // @router /profile [get]
  132. func (c *UserController) Profile() {
  133. uid := c.GetUserIdByToken()
  134. v, err := models.GetUserById(uid)
  135. if err != nil {
  136. c.Data["json"] = err.Error()
  137. } else {
  138. c.Data["json"] = v
  139. }
  140. c.ServeJSON()
  141. }
  142.  
  143. // Get Funds ...
  144. // @Get My Funds
  145. // @Security mySecurityApiKey
  146. // @Description get my Funds
  147. // @Success 200 {object} []models.Fund
  148. // @Failure 403
  149. // @router /funds [get]
  150. func (c *UserController) Funds() {
  151. uid := int(c.GetUserIdByToken())
  152. fund, _ := models.GetAllAccountByUserId(uid)
  153. c.Data["json"] = fund
  154. c.ServeJSON()
  155. }

  

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. sql语句优化(二)

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 建立索引好处  : 之前做的一个项目 , 一个查询10w多条的数据 ,需要20s ,后来加 ...

  2. 运行python文件时出错SyntaxError: Non-UTF-8 code starting with '\xb5' in file, but no encoding declared;

    今天ytkah在运行python文件时出现错误,提示如下,很明显这是没有定义python文件编码引起的问题,那么要怎么解决呢?很简单,在文件头部定义一下就可以了. File "hello.p ...

  3. awk命令的基本使用

    命令主要用法 -格式1:前置命令 | awk [选项] '[条件]{编辑指令}' -格式2:awk [选项] '[条件]{编辑指令}' filename 常用命令选项 -F:指定分隔符,可省略(默认空 ...

  4. git的介绍

    1.Git工作区域 2.向仓库中添加文件流程 三.Git初始化及仓库创建和操作 1.Git安装之后需要进行一些基本信息设置 a.设置用户名:git  config -- global  user.na ...

  5. mongodb studio 3t 破解无限使用脚本

    @echo off ECHO 重置Studio 3T的使用日期...... FOR /f "tokens=1,2,* " %%i IN ('reg query "HKEY ...

  6. jquery 无缝轮播

    新闻公告无缝轮播--demo 理解:向上移动一个li的高度+margin-bottom值,同时将ul第一个的li插入到ul的最后一个位置. <!DOCTYPE html> <html ...

  7. vue-自定义pc端软键盘

    <template> <div> <el-input v-model="money" type="textarea" placeh ...

  8. throws和throw的区别

    throws是声明在方法上,告诉调用者这个方法可能会出现的问题.格式  :   方法()   throws  自定义异常类(异常类)    就是在这个方法里面会出问题时,new  throw时,    ...

  9. word2vec 评测 size_diff

    This is a test for word2vecWed Nov 07 16:47:19 2018dir of model1: ./model/window3_ min_count2_worker ...

  10. .Net拾忆:Asp.net请求管道

    w3wp.exe应该很熟悉,调试应用时候附加到进程就是这个服务:w3wp.exe和应用池相关联,每个应用池会有一个w3wp; 一.Http请求到iis应用池 IIS 5.x iis运行在inetinf ...