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 ...
随机推荐
-
Selenium VS QTP
Selenium系列 QTP 适用结构 B/S结构 C/S.B/S结构 适用人员 有一定代码基础(Java.C#.Python.Ruby) 对编程不是很熟悉的.厌烦了做手工功能测试的.想快速进 ...
-
IOS网络第二天 - 02-异步HTTP请求block回调 解析
************** #import "HMViewController.h" #import "MBProgressHUD+MJ.h" @interf ...
-
cancel-ng-swipe-right-on-child
<!DOCTYPE html> <html lang="en" ng-app="myapp"> <head> <met ...
-
Use OWIN to Self-Host ASP.NET Web API 2
Open Web Interface for .NET (OWIN)在Web服务器和Web应用程序之间建立一个抽象层.OWIN将网页应用程序从网页服务器分离出来,然后将应用程序托管于OWIN的程序 ...
-
【推荐分享】Python电子书,视频教程(Let&#39;s Python系列视频教程等)(百度网盘)
资源都放在百度网盘里了. Python视频教程(Python Django视频教程全集—*辅仁大学):http://pan.baidu.com/s/1dDgiWIt Python视频教程(let's ...
-
github使用方法(一)
github是目前流行的代码托管网站. github.com是一个网站,它为你提供一个远程版本库(你和你的协作者的工作成果最终提交在这里):同时它也是一个共享平台,你可以在这里找到数不尽的源码. 关于 ...
-
js动态加载js css文件,可以配置文件后辍,防止浏览器缓存
js的引用,在浏览器,或微信*问经常会遇到文件改了,但就是没有更新的问题,使用此函数可以轻松解决缓存问题只需要把js的引用方式改为使用此函数加载即可 源码如下: /** * js动态加载js css ...
-
Word页眉、页码的使用:利用分隔符设置指定页显示页眉,解决页码显示{PAGE \* MERGEFORMAT}问题
不常编辑对文档有格式要求的朋友来说,偶尔需要编辑指定格式页眉页码的word文档时,会一时不记得如何使用,在网上搜索半天,异常烦躁. 特整理一下,记录下来,备不时只需. 以下操作环境为word2016. ...
-
Jrebel 配置
先下载插件 http://139.199.89.239:1008/88414687-3b91-4286-89ba-2dc813b107ce http://jrebel.autoseasy.cn/xix ...
-
【转载】详解KMP算法
网址:https://www.cnblogs.com/yjiyjige/p/3263858.html