Beego 使用教程 9:ORM 操作数据库(上)

beego 是一个用于Go编程语言的开源、高性能的 web 框架

beego 被用于在Go语言中企业应用程序的快速开发,包括RESTful API、web应用程序和后端服务。它的灵感来源于Tornado, Sinatra 和 Flask

beego 官网:http://beego.gocn.vip/

上面的 beego 官网如果访问不到,看这篇文章《beego 官网文档本地环境搭建》

注意:本文的 beego 文档使用的就是本地环境搭建的文档,因为官网文档已经不可用了

beego 官方 github 仓库:https://github.com/beego/beego

上一讲,讲了 beego 页面视图,需要的朋友可以查看《Beego 使用教程 8:Session 和 Cookie》

这一讲,讲解 ORM 操作数据库。代码使用上一讲的代码

1、基本使用

新建数据库 beego-demo-db,建表 sql 看下面

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`age` int(11) NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;SET FOREIGN_KEY_CHECKS = 1;

安装依赖,执行下面命令

go get github.com/go-sql-driver/mysql
go mod tidy

在项目根目录下,新建dao文件目录,在dao 目录下新建 user.go,user.go 代码是下面内容

package daoimport ("github.com/beego/beego/v2/client/orm"//匿名引入mysql驱动_ "github.com/go-sql-driver/mysql"
)type User struct {Id   int    `orm:"auto"`Name string `orm:"column(name)"`Age  int    `orm:"column(age)"`
}func init() {// 注册 User 结构体模型orm.RegisterModel(new(User))orm.RegisterDataBase("default", "mysql", "root:123456@tcp(192.168.3.232:3306)/beego-demo-db?charset=utf8")
}func Add() {o := orm.NewOrm()user := new(User)user.Name = "贾元春"user.Age = 25// 添加数据o.Insert(user)
}

在 controller 目录下新建 dao.go ,dao.go 代码是下面

package controllerimport ("beego-demo/dao""github.com/beego/beego/v2/server/web""github.com/beego/beego/v2/server/web/context"
)func RegisterDaoRoutes() {web.Get("/user/add", func(ctx *context.Context) {dao.Add()ctx.WriteString("添加成功")})
}

运行测试

浏览器访问:http://localhost:9090/user/add

2、数据库设置

最大连接数

最大连接数的设置有两种方式,一种方式是在注册数据库的时候,使用MaxOpenConnections 选项

orm.RegisterDataBase("default", "mysql", "root:root@/orm_test?charset=utf8", orm.MaxOpenConnections(100))

也可以在注册之后修改

orm.SetMaxOpenConns("default", 30)

最大空闲连接数

最大空闲连接数的设置有两种方式,一种方式是在注册数据库的时候,使用MaxIdleConnections选项

orm.RegisterDataBase("default", "mysql", "root:root@/orm_test?charset=utf8", orm.MaxIdleConnections(20))

注册之后修改

orm.SetMaxIdleConns("default", 30)

3、注册驱动

大多数时候,你只需要使用默认的那些驱动,有

	DRMySQL                      // mysqlDRSqlite                     // sqliteDROracle                     // oracleDRPostgres                   // pgsqlDRTiDB                       // TiDB

如果你需要注册自定义的驱动,可以使用

// 参数1   driverName
// 参数2   数据库类型
// 这个用来设置 driverName 对应的数据库类型
// mysql / sqlite3 / postgres / tidb 这几种是默认已经注册过的,所以可以无需设置
orm.RegisterDriver("mysql", yourDriver)

4、模型定义与注册

Beego 的 ORM 模块要求在使用之前要先注册好模型,并且 Beego 会执行一定的校验,用于辅助检查模型和模型之间的约束。并且模型定义也会影响自动建表功能自动建表

Beego 的模型定义,大部分都是依赖于 Go 标签特性,可以设置多个特性,用;分隔。同一个特性的不同值使用,来分隔

orm:"null;rel(fk)"

注册模型有三个方法

4.1、模型基本设置

表名

默认的表名规则,使用驼峰转蛇形

AuthUser -> auth_user
Auth_User -> auth__user
DB_AuthUser -> d_b__auth_user

除了开头的大写字母以外,遇到大写会增加 _,原名称中的下划线保留

也可以自定义表名,只需要实现接口TableNameI

type User struct {Id intName string
}func (u *User) TableName() string {return "auth_user"
}

同时,也可以在注册模型的时候为表名加上前缀或者后缀

为字段设置 DB 列的名称

Name string `orm:"column(user_name)"`

忽略字段
设置 - 即可忽略模型中的字段

type User struct {// ...AnyField string `orm:"-"`//...
}

索引
默认情况下,可以在字段定义里面使用 Go 的标签功能指定索引,包括指定唯一索引。

例如,为单个字段增加索引

Name string `orm:"index"`

或者,为单个字段增加 unique 键

Name string `orm:"unique"`

实现接口TableIndexI,可以为单个或多个字段增加索引

type User struct {Id    intName  stringEmail string
}// 多字段索引
func (u *User) TableIndex() [][]string {return [][]string{[]string{"Id", "Name"},}
}// 多字段唯一键
func (u *User) TableUnique() [][]string {return [][]string{[]string{"Name", "Email"},}
}

主键
可以用auto显示指定一个字段为自增主键,该字段必须是 int, int32, int64, uint, uint32, 或者 uint64

MyId int32 `orm:"auto"`

如果一个模型没有定义主键,那么 符合上述类型且名称为 Id 的模型字段将被视为自增主键。

如果不想使用自增主键,那么可以使用pk设置为主键

Name string `orm:"pk"`

注意,目前 Beego 的非自增主键和联合主键支持得不是特别好。建议普遍使用自增主键

鉴于 go 目前的设计,即使使用了 uint64,但你也不能存储到他的最大值。依然会作为 int64 处理

默认值
默认值是一个扩展功能,必须要显示注册默认值的Filter,而后在模型定义里面加上default的设置

import (
"github.com/beego/beego/v2/client/orm/filter/bean"
"github.com/beego/beego/v2/client/orm"
)type DefaultValueTestEntity struct {
Id            int
Age           int `default:"12"`
AgeInOldStyle int `orm:"default(13);bee()"`
AgeIgnore     int
}func XXX() {builder := bean.NewDefaultValueFilterChainBuilder(nil, true, true)orm.AddGlobalFilterChain(builder.FilterChain)o := orm.NewOrm()_, _ = o.Insert(&User{ID: 1,Name: "Tom",})
}

自动更新时间

Created time.Time `orm:"auto_now_add;type(datetime)"`
Updated time.Time `orm:"auto_now;type(datetime)"`
  • auto_now 每次 model 保存时都会对时间自动更新
  • auto_now_add 第一次保存时才设置时间

对于批量的 update 此设置是不生效的

引擎

仅支持 MySQL,只需要实现接口TableEngineI。

默认使用的引擎,为当前数据库的默认引擎,这个是由你的 mysql 配置参数决定的。

你可以在模型里设置 TableEngine 函数,指定使用的引擎

type User struct {Id    intName  stringEmail string
}// 设置引擎为 INNODB
func (u *User) TableEngine() string {return "INNODB"
}

null

数据库表默认为 NOT NULL,设置 null 代表 ALLOW NULL

Name string `orm:"null"`

size

string 类型字段默认为 varchar(255)

设置 size 以后,db type 将使用 varchar(size)

Title string `orm:"size(60)"`

digits / decimals

设置 float32, float64 类型的浮点精度

Money float64 `orm:"digits(12);decimals(4)"`

总长度 12 小数点后 4 位 eg: 99999999.9999

type

设置为 date 时,time.Time 字段的对应 db 类型使用 date

Created time.Time `orm:"auto_now_add;type(date)"`

设置为 datetime 时,time.Time 字段的对应 db 类型使用 datetime

Created time.Time `orm:"auto_now_add;type(datetime)"`

Precision

datetime字段设置精度值位数,不同 DB 支持最大精度值位数也不一致

type User struct {...Created time.Time `orm:"type(datetime);precision(4)"`...
}

Comment

为字段添加注释

type User struct {...Status int `orm:"default(1);description(这是状态字段)"`...
}

注意: 注释中禁止包含引号

4.2、模型字段与数据库类型的映射

在此列出 ORM 推荐的对应数据库类型,自动建表功能也会以此为标准。

默认所有的字段都是 NOT NULL

这里只列出来 mysql 数据库的对应类型,更多的数据库请查看官方文档

下一讲:《Beego 使用教程 10:ORM 操作数据库(下)》

至此完

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/26223.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pikachu靶场通关全流程

目录 暴力破解: 1.基于表单的暴力破解: 2.验证码绕过(on server): 3.验证码绕过(on client): token防爆破: XSS: 1.反射型xss(get): 2.反射性xss(post): 3.存储型xss&#…

2024中国网络安全产品用户调查报告(发布版)

自2020年始,人类进入了21世纪的第二个十年,全球进入了百年未有之大变局,新十年的开始即被新冠疫情逆转了全球化发展的历程,而至2022年3月俄乌战争又突然爆发,紧接着2023年7月“巴以冲突"皱起,世界快速…

7.Nginx动静分离

介绍 把动态和静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。 动静分离从目前实现角度分为两种: 1.纯粹把静态文件独立成单独的域名,放在独立的静态资源服务器上,目前主流推崇的方案。 2.动态和静态文件混合在一起发布,通过nginx来分开。 通过loc…

Flutter基础 -- Flutter常用组件

目录 1. 文本组件 Text 1.1 基础用法 1.2 Text 定义 1.3 Text 示例 1.4 Text.rich、RichText 、TextSpan 1.5 RichText 示例 2. 导入资源 2.1 加入资源 2.2 加入图片 3. 图片组件 image 3.1 colorBlendMode 混合参数 3.2 fit 图片大小适配 3.3 ImageProvider 图片…

Echarts 绘制自定义图形

文章目录 需求分析需求 在 Echarts 中绘制一个不规则图形放置在指定位置 分析 可以先从一个六边形画起 可以使用 ECharts 中的『自定义图形』来绘制一个封闭的六边形。以下是一个简单的示例代码,演示了如何使用 ECharts 绘制一个封闭的六边形: <!DOCTYPE html> &l…

《数据结构与算法之美》学习笔记二

前言&#xff1a;本篇文章介绍了一下二叉树中的基本知识点&#xff0c;包括二叉树的种类、二叉树的存储方式以及二叉树的深度和广度优先遍历&#xff1b;以及《数据结构与算法》中对于数组的讲解记录&#xff0c;只记录了本前端能看懂的&#x1f913;&#xff0c;还有很多知识点…

视频行人搜索 (Person Search in Videos)

文章目录 视频行人搜索 (Person Search in Videos)图像行人搜索存在问题Video PS 定义MTA-PS数据集First person search dataset in videosComplicated ambient conditions and realistic monitoring scenariosPrivacy insensitivity 方法 视频行人搜索 (Person Search in Vide…

FiRa标准UWB MAC实现(三)——距离如何获得?

继续前期FiRa MAC相关介绍,将FiRa UWB MAC层相关细节进一步进行剖析,介绍了UWB技术中最重要的一个点,高精度的距离是怎么获得的,具体使用的测距方法都有哪些,原理又是什么。为后续FiRa UWB MAC的实现进行铺垫。 3、测距方法 3.1 SS-TWR SS-TWR为Single-Sided Two-Way Ra…

ER实体关系图(一)

用户表(user)、用户钱包表(user_wallet)(与user是1对1关系)、用户钱包交易日志表(user_wallet_log)(与user是1对多关系) user&#xff1a;用户表通常包含用户的基本信息&#xff0c;例如用户ID&#xff08;主键&#xff09;、用户名、密码&#xff08;通常加密存储&#xff09;…

Windows远程桌面连接

试验&#xff1a;使用Oracle VM VirtualBox创建虚拟机与物理机进行远程桌面连接实验 1. 准备 使用VirtualBox创建一台win10虚拟机&#xff0c;并与本地物理机相互ping通。&#xff08;注意&#xff1a;如何存在ping不通&#xff0c;可以试一下关闭Windows的防火墙&#xff09;…

iLogtail 2.0 重大升级,端上支持 SPL

作者&#xff1a;太业 流式处理语言发展 早期流式处理概念&#xff1a; 20 世纪 70 年代&#xff0c;编程语言如 APL 提供了对数组的流式操作&#xff0c;这可以看作是流式处理语法的早期形式。管道&#xff08;Pipes&#xff09;概念在 UNIX 系统中的引进使得可以通过命令行将…

课时152:项目发布_手工发布_方案解读

1.2.1 方案解读 学习目标 这一节&#xff0c;我们从 基础知识、简单实践、小结 三个方面来学习 基础知识 案例需求 实现一套业务环境的项目发布流程&#xff0c;基本的网站架构效果如下&#xff1a;架构解读&#xff1a;负载均衡采用Nginx服务&#xff0c;基于请求内容进行…

孩子用的灯什么样的好?劣质LED台灯所带来的三大危害

随着科技设备不断的进步&#xff0c;护眼台灯已经逐渐成为了书房中不可或缺的一员。它以多功能的特性赢得了广大消费者的青睐。然而&#xff0c;市面上的护眼台灯质量良莠不齐&#xff0c;这使得消费者的选择变得更加困难。不良产品不仅可能带来安全隐患&#xff0c;甚至有潜在…

AI 大模型训练中,通常会采用哪些方法?(输入篇)

大家好 某种程度来说大模型训练的核心算法就是300到400行代码&#xff0c;如果真正理解了并不难。下面我将带大家分析常规大模型训练有几个阶段以及在训练中一般会用到哪些方法。 由上图可以看出&#xff0c;大模型训练主要有四个阶段&#xff1a;预训练、有监督微调、奖励建模…

大模型的高考数学成绩单:及格已经非常好了

让考生头皮发麻的高考数学&#xff0c;可难倒了顶尖 AI 大模型。 一年一度的高考即将落幕&#xff0c;衷心希望各位考生都超常发挥&#xff0c;考出满意的好成绩&#xff01;&#xff01; 和往年一样&#xff0c;除了让 AI 大模型写写高考作文&#xff0c;我们也选取了六家国…

打工人和学生党的福利,NewspaceGpt使用新体验

使用地址&#xff1a;https://newspace.ai0.cn/ 个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮…

小型气象站:现代气象监测的便携化解决方案

TH-QC12在气象监测领域&#xff0c;技术的不断创新和进步推动了监测设备的多样化和便携化。小型气象站作为这一趋势下的产物&#xff0c;以其体积小、功能全、操作简便等特点&#xff0c;受到了广泛的关注和应用。 小型气象站的技术特点 小型气象站集成了多种气象传感器&…

提升易用性,OceanBase生态管控产品的“从小到大”

2022年&#xff0c;OceanBase发布4.0版本“小鱼”&#xff0c;并首次公开提出了单机分布式一体化这一理念&#xff0c;旨在适应大小不同规模的工作负载&#xff0c;全面满足用户数据库“从小到大”全生命周期的需求。当时&#xff0c;我们所说的“从小到大”主要聚焦于数据库的…

【Qt 学习笔记】Qt窗口 | 对话框 | 模态与非模态对话框的创建

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt窗口 | 对话框 | 创建模态及非模态对话框 文章编号&#xff1a;Qt 学…

准橙人工翻译微信小程序,100+专业领域的译者在线帮你翻译!藏语、维吾尔语、哈萨克语、壮语、彝文、蒙古语统统支持人工翻译!

亲爱的朋友们&#xff0c;我们深知每一种语言都承载着独特的文化和历史&#xff0c;为了传承和弘扬这些宝贵的文化遗产&#xff0c;我们诚挚地邀请具备翻译经验并熟练掌握以下任意一门语言的您加入我们的团队&#xff01; 中国少数民族语言&#xff1a;藏语、维吾尔语、哈萨克…