参考资料
ORM框架 beego的使用
根据数据库和对象关系创建实体类(默认驼峰法)
beego的初始化
在内存中注册一个叫做default的数据源,该数据源对应的是go这个数据库
要操作的model也一起注册进去
一般会申明一个全局的Ormer对象
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()
}
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
}
查询
根据条件简单查询的两种方式 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
}
其它查询
findAll()
OrderBy
Count()
// 排序+查询所有
query := O.QueryTable("chapter").OrderBy("sort").All(&list)
total, _ := O.QueryTable("chapter").Filter("name", name).Count()
DML操作
新增的话,数据库主键最好设置为自增,也支持一次批量新增
修改的话,默认根据主键修改全部的字段,如果只是修改部分字段,需要设置参数
删除函数返回的第一个参数,是成功删除的个数
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)
}
}
实体类和数据库映射关系
表名和字段名默认采用驼峰法,比如MyBook对象对应数据库 my_book表,SystemId属性对应数据库表中 system_id 栏
表名支持自定义映射,不按照驼峰法
type MyBook struct{
Id int
Name string
Author string
Image string
CreatedAt time.Time
UpdatedAt time.Time
}
func (mybook *MyBook) TableName() string {
return "book"
}
字段名可以通过注解实现自定义映射
Name string `orm:"column(user_name)"`
工具类的字段可以通过 orm:"-" 实现类似 Transient的效果
//该字段只是在代码中用,但是不需要映射到数据库中
Chapters []*Chapter `orm:"-"`
表名支持统一前缀
注意事项
支持类似于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