Beego ORM

参考资料

官方文档
https://beego.me/docs/intro/

ORM框架 beego的使用

  1. 根据数据库和对象关系创建实体类(默认驼峰法)
  2. beego的初始化
  • 在内存中注册一个叫做default的数据源,该数据源对应的是go这个数据库
  • 要操作的model也一起注册进去
  • 一般会申明一个全局的Ormer对象
  1. database init函数里面记得 import mysql的相关驱动和类库
import (
    "fmt"
    "github.com/astaxie/beego"
    "github.com/astaxie/beego/orm"
    _ "github.com/go-sql-driver/mysql"
)
var O orm.Ormer
func init() {
       orm.RegisterDriver("mysql", orm.DRMySQL)
       orm.RegisterDataBase("default", "mysql", "root:123456@tcp(127.0.0.1:3306)/go?charset=utf8")
       orm.RegisterModel(new(User), new(Profile))
       O = orm.NewOrm()
}
  1. Beego API
type Ormer interface {
    Read(interface{}, …string) error
    ReadOrCreate(interface{}, string, …string) (bool, int64, error)
    Insert(interface{}) (int64, error)
    InsertMulti(int, interface{}) (int64, error)
    Update(interface{}, …string) (int64, error)
    Delete(interface{}) (int64, error)
    LoadRelated(interface{}, string, …interface{}) (int64, error)
    QueryM2M(interface{}, string) QueryM2Mer
    QueryTable(interface{}) QuerySeter
    Using(string) error
    Begin() error
    Commit() error
    Rollback() error
    Raw(string, …interface{}) RawSeter
    Driver() Driver
}

查询

  1. 根据条件简单查询的两种方式 QueryTable方式,和Read方式,QueryTable功能更强大些,类似于Mybatis,而Read方式类似于JPA)
  • 一种是通过数据库SQL来查询,返回结果封装到book这个对象中
  • 第二种是类似于JPA,根据对象来映射数据库,并且查询结果返回到该对象中
  • 通过Read直接查询的话,默认是根据主键查询,如果对象传的不是主键字段,需要指定
func GetBookByName(name string)(*Book, error){
    book := new(Book)
    err := O.QueryTable("book").Filter("name", name).One(book)
    if err != nil || book.Id < 1{
        return nil, err
    }
    return book, nil
}

func FindBookById(id int) (*Book, error){
    book:= Book{Id:id}
    err:=O.Read(&book)
    CheckNil(err)
    fmt.Println(book)
    return  &book,nil
}

func FindBookByAuthor(author string) (*Book, error){
    book:= Book{Author:author}
    err:=O.Read(&book,"author")
    CheckNil(err)
    fmt.Println(book)
    return  &book,nil
}
  1. 其它查询
  • findAll()
  • OrderBy
  • Count()
// 排序+查询所有
query := O.QueryTable("chapter").OrderBy("sort").All(&list)

total, _  := O.QueryTable("chapter").Filter("name", name).Count()

DML操作

https://beego.me/docs/mvc/model/object.md

  1. 新增的话,数据库主键最好设置为自增,也支持一次批量新增
  2. 修改的话,默认根据主键修改全部的字段,如果只是修改部分字段,需要设置参数
  3. 删除函数返回的第一个参数,是成功删除的个数
func BookAdd(book *Book)(int64, error){
    return O.Insert(book)
}

successNums, err := o.InsertMulti(100, users)


func CheckAndDelete(title string){
    var undownload Undownload
    O.QueryTable("undownload").Filter("chapter_title", title).One(&undownload)
    if  undownload.Id >0{
        num,err:=O.QueryTable("undownload").Filter("Id", undownload.Id).Delete()
        models.CheckNil(err)
        fmt.Println(num)
    }
}

实体类和数据库映射关系

  1. 表名和字段名默认采用驼峰法,比如MyBook对象对应数据库 my_book表,SystemId属性对应数据库表中 system_id 栏
  2. 表名支持自定义映射,不按照驼峰法
type MyBook struct{
    Id int
    Name string
    Author string
    Image string
    CreatedAt time.Time
    UpdatedAt time.Time
}

func (mybook *MyBook) TableName() string {
    return "book"
}
  1. 字段名可以通过注解实现自定义映射
Name string `orm:"column(user_name)"`
  1. 工具类的字段可以通过 orm:"-" 实现类似 Transient的效果
//该字段只是在代码中用,但是不需要映射到数据库中
Chapters []*Chapter `orm:"-"`
  1. 表名支持统一前缀

注意事项

  • 支持类似于JPA的一对一、一对多、多对多查询,通过注解实现
  • 支持SQL语句输出的功能 (orm.Debug = true),建议生产环境关闭
  • 支持数据库连接池的配置 orm.RegisterDataBase("default", "mysql", "root:root@/orm_test?charset=utf8", maxIdle, maxConn)
  • beego直接通过SQL操作数据库,O.Raw(sql1).Exec() 直接执行sql语句
   sql1 := "insert into user (name,profile_id) values ('ming',1),('hua',2),('qiang',3);"
   sql2 := "insert into profile (age) values (16),(14),(15);"
    //使用Raw().Exec()执行sql
   O.Raw(sql1).Exec()
   O.Raw(sql2).Exec()

安装bee项目生成工具

go get -u github.com/astaxie/beego
go get -u github.com/beego/bee
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。