golang学习笔记16 beego orm 数据库操作
golang学习笔记16 beego orm 数据库操作
beego ORM 是一个强大的 Go 语言 ORM 框架。她的灵感主要来自 Django ORM 和 SQLAlchemy。
目前该框架仍处于开发阶段,可能发生任何导致不兼容的改动。
官方文档:https://beego.me/docs/mvc/model/overview.md
已支持数据库驱动:
- MySQL:github.com/go-sql-driver/mysql
- PostgreSQL:github.com/lib/pq
- Sqlite3:github.com/mattn/go-sqlite3
以上数据库驱动均通过基本测试,但我们仍需要您的反馈。
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`
...
注意:我们不建议您在部署产品后这样做。
- // 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 数据库操作的更多相关文章
- golang学习笔记8 beego参数配置 打包linux命令
golang学习笔记8 beego参数配置 打包linux命令 参数配置 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/docs/mvc/contro ...
- golang学习笔记12 beego table name `xxx` repeat register, must be unique 错误问题
golang学习笔记12 beego table name `xxx` repeat register, must be unique 错误问题 今天测试了重新建一个项目生成新的表,然后复制到旧的项目 ...
- golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息
golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放 ...
- golang学习笔记9 beego nginx 部署 nginx 反向代理 golang web
golang学习笔记9 beego nginx 部署 nginx 反向代理 golang web Nginx 部署 - beego: 简约 & 强大并存的 Go 应用框架https://bee ...
- golang学习笔记6 beego项目路由设置
golang学习笔记5 beego项目路由设置 前面我们已经创建了 beego 项目,而且我们也看到它已经运行起来了,那么是如何运行起来的呢?让我们从入口文件先分析起来吧: package main ...
- Django 2.0 学习(14):Django ORM 数据库操作(上)
Django ORM 数据库操作(上) ORM介绍 映射关系: 数据库表名 ---------->类名:数据库字段 ---------->类属性:数据库表一行数据 ----------&g ...
- Android学习笔记(十七)——数据库操作(下)
//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 这一次我们来试一试升级数据库,并进行数据库的CRUD操作,其中, C 代表添加(Create) ,R 代表查询 ...
- Django学习笔记之Django ORM相关操作
一般操作 详细请参考官方文档 必知必会13条 <> all(): 查询所有结果 <> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <> ...
- Hibernate学习笔记三:常用数据库操作语句
转载请注明原文地址: 一:HQL 1:HQL语句格式:select from POJO类名 where 条件表达式 group by 属性 having 聚集函数 order by 属性 [其中,fr ...
随机推荐
- sql语句优化(二)
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 建立索引好处 : 之前做的一个项目 , 一个查询10w多条的数据 ,需要20s ,后来加 ...
- 运行python文件时出错SyntaxError: Non-UTF-8 code starting with '\xb5' in file, but no encoding declared;
今天ytkah在运行python文件时出现错误,提示如下,很明显这是没有定义python文件编码引起的问题,那么要怎么解决呢?很简单,在文件头部定义一下就可以了. File "hello.p ...
- awk命令的基本使用
命令主要用法 -格式1:前置命令 | awk [选项] '[条件]{编辑指令}' -格式2:awk [选项] '[条件]{编辑指令}' filename 常用命令选项 -F:指定分隔符,可省略(默认空 ...
- git的介绍
1.Git工作区域 2.向仓库中添加文件流程 三.Git初始化及仓库创建和操作 1.Git安装之后需要进行一些基本信息设置 a.设置用户名:git config -- global user.na ...
- mongodb studio 3t 破解无限使用脚本
@echo off ECHO 重置Studio 3T的使用日期...... FOR /f "tokens=1,2,* " %%i IN ('reg query "HKEY ...
- jquery 无缝轮播
新闻公告无缝轮播--demo 理解:向上移动一个li的高度+margin-bottom值,同时将ul第一个的li插入到ul的最后一个位置. <!DOCTYPE html> <html ...
- vue-自定义pc端软键盘
<template> <div> <el-input v-model="money" type="textarea" placeh ...
- throws和throw的区别
throws是声明在方法上,告诉调用者这个方法可能会出现的问题.格式 : 方法() throws 自定义异常类(异常类) 就是在这个方法里面会出问题时,new throw时, ...
- word2vec 评测 size_diff
This is a test for word2vecWed Nov 07 16:47:19 2018dir of model1: ./model/window3_ min_count2_worker ...
- .Net拾忆:Asp.net请求管道
w3wp.exe应该很熟悉,调试应用时候附加到进程就是这个服务:w3wp.exe和应用池相关联,每个应用池会有一个w3wp; 一.Http请求到iis应用池 IIS 5.x iis运行在inetinf ...