go beego框架之orm

一 orm概述

官网文档:https://beego.me/docs/mvc/model/orm.md
orm特性:

  • 支持 Go 的所有类型存储
  • 轻松上手,采用简单的 CRUD 风格
  • 自动 Join 关联表
  • 跨数据库兼容查询
  • 允许直接使用 SQL 查询/映射
  • 严格完整的测试保证 ORM 的稳定与健壮

二 已支持的数据库驱动

MySQL:https://github.com/go-sql-driver/mysql
PostgreSQL:https://github.com/lib/pq
Sqlite3:https://github.com/mattn/go-sqlite

三 安装

	go get github.com/astaxie/beego/orm

四 知识点详解

1 常用数据库设置函数

RegisterDriver

  • 作用:注册数据库驱动
  • 函数
	// 参数1   driverName
	// 参数2   数据库类型
	// 这个用来设置 driverName 对应的数据库类型
	// mysql / sqlite3 / postgres 这三种是默认已经注册过的,所以可以无需设置
	func RegisterDriver(driverName string, typ DriverType) error
  • 数据库类型
// For version 1.6
	orm.DRMySQL
	orm.DRSqlite
	orm.DRPostgres
	// < 1.6
	orm.DR_MySQL
	orm.DR_Sqlite
	orm.DR_Postgres
  • 举例
orm.RegisterDriver("mysql", orm.DRMySQL)

RegisterDataBase

  • 作用:注册连接数据库
  • 函数:
	// 参数1        数据库的别名,用来在 ORM 中切换数据库使用
	// 参数2        driverName
	// 参数3        对应的链接字符串
	// 参数4(可选)  设置最大空闲连接
	// 参数5(可选)  设置最大数据库连接 (go >= 1.2)
func RegisterDataBase(aliasName, driverName, dataSource string, params ...int) error
  • 举例
/*
数据库用户名:root,
数据库密码:123456
ip:127.0.0.1
端口号:3306
数据库名:hio
字符编码:charset=utf8
*/
orm.RegisterDataBase("default", "mysql", "root:123456@tcp(127.0.0.1:3306)/hio?charset=utf8")

2 模型函数

RegisterModel

备注:
结构体 和 数据库表的映射关系:
例如:
AuthUser ->auth_user
Auth_User->auth__user
DB_AuthUser->d_b__auth_user
总结: 结构体名字中 第一个字母小写, 后面遇到大写字母小写,并在前面加下划线 组成的名字,为数据库中的表名
  • 作用:注册模型
  • 函数
func RegisterModel(models ...interface{})
// 备注:可以注册多个模型
  • 举例
type UserInfo struct {
    Id        int
    Username  string
    Password  string
}
func init() {
    orm.RegisterModel(new(UserInfo))
}

3 orm 接口使用

接口函数如下:

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
}

下面例子公用代码如下:
备注: 文档末尾会将整体代码附加

package main
import (
    "github.com/astaxie/beego/orm"
    _ "github.com/go-sql-driver/mysql"
)
type UserInfo struct {
    Id        int
    Username  string
    Password  string
}
func init() {
    orm.Debug = true
    orm.RegisterDriver("mysql", orm.DRMySQL)
    orm.RegisterDataBase("default", "mysql", "root:123456@tcp(127.0.0.1:3306)/hio?charset=utf8")
    orm.RegisterModel(new(UserInfo))
}

(1) insert

举例

    user := UserInfo{Username: "wangwu", Password: "123456"}
    id, err := o.Insert(&user)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println("id = ", id)

(2) update

	user := UserInfo{Username: "xuliu", Password: "123456"}
	user.Id = 2
	num, err := o.Update(&user)
	if err != nil {
	    fmt.Println(err)
	    return
	}
	fmt.Println("num = ", num)

(3) delete

	user := UserInfo{Id: 2}
	num, err := o.Delete(&user)
	if err != nil {
	    fmt.Println(err)
	    return
	}
	fmt.Println("num = ", num)

(4) 读: read

	user := UserInfo{Id: 1}
	err := o.Read(&user)
	if err != nil {
	    fmt.Println(err)
	    return
	}
	fmt.Println("num = ", user)

(5) 读: raw

  • maps形式接收
    备注: 每一个map中存放了一组数据
 var maps []orm.Params
    num, err :=o.Raw("select * from user_info").Values(&maps)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println("num = ", num)
    for _,v := range maps {
        fmt.Println("user info &v", v)
    }
  • 对象数组形式接收
 var users []UserInfo
    num, err :=o.Raw("select * from user_info").QueryRows(&users)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println("num = ",num)
    fmt.Println("users = ", users)

(6) 读:NewQueryBuilder方式组装sql

	var users []UserInfo
		
	// 构造sql语句
	qb,_ := orm.NewQueryBuilder("mysql")
	qb.Select("*").From("user_info").Where("username = 'lisi'").Limit(1)
	sql := qb.String()
	
	num, err := o.Raw(sql).QueryRows(&users)
	if err != nil {
	    fmt.Println(err)
	    return
	}
	fmt.Println("num = ",num)
	fmt.Println("users = ", users)
	*/

五 代码

/*
创建数据库代码:
create table user_info(id int auto_increment, username varchar(32), password varchar(128),  paimary key(id))
*/

package main
import (
    "github.com/astaxie/beego/orm"
    _ "github.com/go-sql-driver/mysql"
)

type UserInfo struct {
    Id        int
    Username  string
    Password  string
}
func init() {
    orm.Debug = true
    orm.RegisterDriver("mysql", orm.DRMySQL)
    orm.RegisterDataBase("default", "mysql", "root:123456@tcp(127.0.0.1:3306)/hio?charset=utf8")
    orm.RegisterModel(new(UserInfo))
}

func main() {
    o := orm.NewOrm()
    o.Using("default") // 默认使用 default,你可以指定为其他数据库
    // 插入数据
    /*
    user := UserInfo{Username: "wangwu", Password: "123456"}
    id, err := o.Insert(&user)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println("id = ", id)
    */
    // 更新数据
    /*
    user := UserInfo{Username: "xuliu", Password: "123456"}
    user.Id = 2
    num, err := o.Update(&user)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println("num = ", num)
     */
    // 读数据
    /*
    user := UserInfo{Id: 1}
    err := o.Read(&user)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println("num = ", user)
    */
    // 删除数据
    /*
    user := UserInfo{Id: 2}
    num, err := o.Delete(&user)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println("num = ", num)
     */
    // 原生读取
    /*
    var maps []orm.Params
    num, err :=o.Raw("select * from user_info").Values(&maps)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println("num = ", num)
    for _,v := range maps {
        fmt.Println("user info &v", v)
    }
     */
    /*
    var users []UserInfo
    num, err :=o.Raw("select * from user_info").QueryRows(&users)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println("num = ",num)
    fmt.Println("users = ", users)
     */
    // 采用queryBuilder 方式去读
    /*
    var users []UserInfo
    // 构造sql语句
    qb,_ := orm.NewQueryBuilder("mysql")
    qb.Select("*").From("user_info").Where("username = 'lisi'").Limit(1)
    sql := qb.String()
    num, err := o.Raw(sql).QueryRows(&users)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println("num = ",num)
    fmt.Println("users = ", users)
    */
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值