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. MySQL 5.5 服务器变量详解(一)

    autocommit={0|1} 设定MySQL事务是否自动提交,1表示立即提交,0表示需要显式提交.作用范围为全局或会话,可用于配置文件中(但在5.5.8之前的版本中不可用于配置文件),属于动态变量 ...

  2. 配置svn用户及权限

    权限使用的用户名,必须在passwd文件里面存在,权限配置文件的修改立即生效,不必重启SVN: 例如创建一个运维组 用户组格式: [groups] yunwei = ligang,liming 其中, ...

  3. RN TextInput用法

    效果图: 代码: import React, {Component} from 'react' import {StyleSheet, View, Text, TouchableOpacity, Te ...

  4. NginxI/O模型理论基础

    I/O模型介绍 同步IO 关注的是消息通信机制  调用者需要等待被调用者先执行完毕才能往下继续执行   被调用者在执行完自己的任务后并不会同之调用者执行结果需要调用者自己去获取被调用者的执行状态 异步 ...

  5. shell脚本循环和信号

    条件判断 if     条件1:then COMMAND elif  条件2:then COMMAND else COMMAND(:)        :  表示pass  不执行任何命令 fi 读取用 ...

  6. testetest

    resumeLoad renren静态 foolday \ swImg activity01

  7. ftp工具类

    package com.ytd.zjdlbb.service.zjdlbb; import java.io.File;import java.io.FileInputStream;import jav ...

  8. Spark中repartition和partitionBy的区别

    repartition 和 partitionBy 都是对数据进行重新分区,默认都是使用 HashPartitioner,区别在于partitionBy 只能用于 PairRDD,但是当它们同时都用于 ...

  9. SpringBoot java.lang.IllegalArgumentException: Request header is too large

    在application.properties##tomcat 请求设置server.max-http-header-size=1048576server.tomcat.max-connections ...

  10. python 美化打印json数据

    #!/usr/bin/python3 # -*- coding: utf-8 -*- import json data = {'name':'张森','email':'zhangsen@qq.com' ...