Golang 语言 Web 框架 beego v2 之写操作

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: Golang 语言 Web 框架 beego v2 之写操作

01

介绍


beego ORM 是一个强大的 Go 语言 ORM 框架。她的灵感主要来自

Django ORM 和 SQLAlchemy。


已支持的数据库驱动有MySQL、PostgreSQL 和 Sqlite3。


beego v2.x 和 beego v1.x 在 ORM 上的区别是,beego v2.x 的 ORM 对象被设计为无状态的,它是线程安全的,建议大家在使用时,一个数据库只对应一个 ORM 对象。


本文全篇都是以 MySQL 为例。

02

安装


如果您使用的是 beego 框架,beego ORM 已默认安装,如果您没有使用 beego 框架,可使用 go get 安装 beego ORM:


go get github.com/astaxie/beego/client/orm


03

注册


  • 注册驱动
orm.RegisterDriver("mysql", orm.DRMySQL)
  • 参数 1 是驱动名称,参数 2 是驱动类型,需要注意的是,不要忘记导入 MySQL 驱动。
import _ "github.com/go-sql-driver/mysql"
  • 注册数据库
orm.RegisterDataBase("default", "mysql", "root:root@/beego_web?charset=utf8&loc=Local")
  • beego ORM 必须注册一个别名为 default 的数据库,作为默认使用。参数 1 是数据库的别名,用来在 ORM 中切换数据库使用,参数 2 是驱动名称,参数 3 是对应的 dataSource。
    使用 go-sql-driver,驱动默认使用UTC 时间,如需使用本地时间,请设置 loc 的值为 Local。
  • 设置数据库最大空闲连接数
orm.SetMaxIdleConns("default", 10)
  • 根据数据库的别名,设置数据库的最大空闲连接数。
  • 设置数据库最大连接数
orm.SetMaxOpenConns("default", 10)
  • 根据数据库的别名,设置数据库的最大连接数。
  • 注册模型
orm.RegisterModel(new(User))
  • 注册模型,同时注册多个模型,使用英文逗号分隔。
  • 使用表前缀注册模型
orm.RegisterModelWithPrefix("beego_", new(User))
  • 使用表前缀注册模型,同时注册多个模型,使用英文逗号分隔。


注册模型和使用表前缀注册模型,不可同时使用,重复注册模型,会导致成程序 panic。


04

自动建表


  • 默认表名默认的表名规则,是使用驼峰转蛇形,除了开头的大写字母外,遇到大写字母会增加下划线,并且原名已存在的下划线继续保留。
AuthUser -> auth_user
Auth_User -> auth__user
DB_AuthUser -> d_b__auth_user
  • 自定义表名
func (u *User) TableName() string {
  return "user"
}
  • 如果设置了表前缀,自定义表名会在开头拼接上前缀。
  • 自定义存储引擎
func (u *User) TableEngine() string {
  return "INNODB"
}
  • 默认使用 MySQL 数据库设置的存储引擎,如果您需要在程序中指定存储引擎,可以使用以上方式设置。
  • 设置参数
type User struct {
  Id      uint64    `form:"-" orm:"auto;pk;description(主键 ID)"`
  Name    string    `form:"name" orm:"unique;size(30)";description(用户名)`
  Age     uint8     `orm:"index;description(年龄)"`
  Created time.Time `orm:"auto_now_add;type(datetime)"`
  Updated time.Time `orm:"auto_now;type(datetime)"`
}
  • 在结构体中,可以使用 orm 标签设置数据库的属性,限于篇幅,具体使用方法请参考官方手册。
  • 自动建表
err := orm.RunSyncdb("default", false, true)
if err != nil {
  log.Fatalln(err.Error())
  return
}

参数 1 是数据库别名,参数 2 是布尔类型的 force,参数 3 是布尔类型的 verbose。force 为 true 代表 drop table 后再建表;verbose 为 true 代表打印建表的执行过程。

自动建表功能在 force 为 false 时,会自动创建新增的字段和索引。删除或修改操作,需要用户自行手动处理。


05

新增


单条插入:

func (u *UserController) Create() {
  o := orm.NewOrm() // 创建一个 Ormer
  name := u.GetString("name", "unknow")
  age, _ := u.GetUint8("age", 0)
  user := &models.User{
    Name: name,
    Age: age,
  }
  id, err := o.Insert(user)
  if err != nil {
    log.Fatalln(err.Error())
    return
  }
  fmt.Println("id:", id)
}

Insert 方法插入单条数据,接收参数必须是指针类型,返回值有两个,分别是自增id 和 err。


批量插入:


func (u *UserController) Create() {
  o := orm.NewOrm() // 创建一个 Ormer
  users := []models.User{}
  _ = json.Unmarshal(u.Ctx.Input.RequestBody, &users)
  rows, err := o.InsertMulti(2, users)
  if err != nil {
    log.Fatalln(err)
    return
  }
  fmt.Println("rows:", rows)
}

InsertMulti 方法批量插入数据,参数 1 是批量插入的数量,参数 2 是 slice,参数 1 的值为 1 时,将会按照顺序插入 slice 中的数据。返回值有两个,分别是插入行数和 err。


06

修改



func (u *UserController) Update() {
  web.BConfig.WebConfig.AutoRender = false
  o := orm.NewOrm()
  user := models.User{}
  _ = json.Unmarshal(u.Ctx.Input.RequestBody, &user)
  rows, err := o.Update(&user, "Name")
  if err != nil {
    log.Println(err.Error())
    return
  }
  fmt.Println("rows:", rows)
}

Update 方法更新数据,参数 1 是更新对象,参数 2 是更新的字段,多个字段用英文逗号分隔,默认更新多有字段。返回值有两个,分别是更新行数和err。


07

删除



func (u *UserController) Delete() {
  web.BConfig.WebConfig.AutoRender = false
  o := orm.NewOrm()
  id, _ := u.GetUint64("id", 0)
  user := models.User{
    Id: id,
  }
  rows, err := o.Delete(&user)
  if err != nil {
    log.Println(err.Error())
    return
  }
  fmt.Println("rows:", rows)
}

Delete 方法删除数据,参数是删除对象,返回值有两个,分别是更新行数和 err。


08

总结


本文开篇介绍了 beego ORM 的设计思路和已支持的数据库驱动,并且介绍了 v2 和 v1 的区别,然后详细介绍了 beego ORM 的安装和使用方法。关于更多细节,请参阅官方手册。





相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
8
分享
相关文章
Eino:字节跳动开源基于Golang的AI应用开发框架,组件化设计助力构建AI应用
Eino 是字节跳动开源的大模型应用开发框架,帮助开发者高效构建基于大模型的 AI 应用。支持组件化设计、流式处理和可视化开发工具。
162 27
|
5月前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
183 4
Golang语言之管道channel快速入门篇
|
5月前
|
Go
Golang语言文件操作快速入门篇
这篇文章是关于Go语言文件操作快速入门的教程,涵盖了文件的读取、写入、复制操作以及使用标准库中的ioutil、bufio、os等包进行文件操作的详细案例。
91 4
Golang语言文件操作快速入门篇
|
5月前
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
152 3
Golang语言之gRPC程序设计示例
|
5月前
|
Golang语言goroutine协程并发安全及锁机制
这篇文章是关于Go语言中多协程操作同一数据问题、互斥锁Mutex和读写互斥锁RWMutex的详细介绍及使用案例,涵盖了如何使用这些同步原语来解决并发访问共享资源时的数据安全问题。
118 4
Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架
本文概述了Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架。
252 1
|
5月前
|
Golang语言goroutine协程篇
这篇文章是关于Go语言goroutine协程的详细教程,涵盖了并发编程的常见术语、goroutine的创建和调度、使用sync.WaitGroup控制协程退出以及如何通过GOMAXPROCS设置程序并发时占用的CPU逻辑核心数。
156 4
Golang语言goroutine协程篇
Golang语言之Prometheus的日志模块使用案例
这篇文章是关于如何在Golang语言项目中使用Prometheus的日志模块的案例,包括源代码编写、编译和测试步骤。
103 3
Golang语言之Prometheus的日志模块使用案例
实践Golang语言N层应用架构
【10月更文挑战第2天】本文介绍了如何在Go语言中使用Gin框架实现N层体系结构,借鉴了J2EE平台的多层分布式应用程序模型。文章首先概述了N层体系结构的基本概念,接着详细列出了Go语言中对应的构件名称,包括前端框架(如Vue.js、React)、Gin的处理函数和中间件、依赖注入和配置管理、会话管理和ORM库(如gorm或ent)。最后,提供了具体的代码示例,展示了如何实现HTTP请求处理、会话管理和数据库操作。
68 0
Golang语言结构体链式编程与JSON序列化
这篇文章是关于Go语言中结构体链式编程与JSON序列化的教程,详细介绍了JSON格式的基本概念、结构体的序列化与反序列化、结构体标签的使用以及如何实现链式编程。
64 4

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等