你可以在 gorm.DB 对象上使用 Preload、Association 等方法来处理模型关联。...var user User db.Preload("Orders").Find(&user) // 预加载用户的订单信息 2.6 钩子(Hooks) gorm.DB 支持钩子,你可以在执行查询的不同阶段注册回调函数...Chain Method 可以用来将特定筛选条件增加到 gorm.DB 状态中,常见的有 db.Where,db.Select 等。...gorm.DB 支持链式调用,使得你可以通过一系列的方法调用来构建和修改查询。每个方法都会返回一个新的 gorm.DB 对象,其中包含了前一个对象的设置和新的设置。...在 gorm.DB 对象的链式调用过程中,会基于全局 gorm.DB 对象克隆一个新的 gorm.DB 对象,使得每次执行不同的 SQL 相互隔离、互补干扰。
理论上 ORM 可以让我们脱离 SQL,但实际上还是需要懂 SQL 才能更好地使用 ORM。 2.GORM 是什么 GORM 是一个流行的 Golang ORM 库。...go get -u gorm.io/driver/postgres go get -u gorm.io/driver/sqlserver 驱动包按照自己实际使用的 DB 选择即可。...DeletedAt DeletedAt `gorm:"index"` } 字段后的 tag 用来定义字段在 DB 中的相关属性,如 primarykey 表示主键,index 表示索引,type 表示字段类型...string } 拥有软删除能力的模型调用 Delete 时,记录不会被数据库。...更多用法,请参见官方文档 GORM 指南,这里有你想要的一切。
它的设计理念是将数据库表映射为 Go 的结构体(Struct),并通过方法调用来实现对数据的增删改查等操作,从而降低了与数据库交互的复杂性。...选择 GORM 作为数据库操作工具的原因有以下几点:简单易用:GORM 提供了简洁的 API,使得开发者能够用最少的代码完成数据库操作,降低了学习成本和开发成本。...3.2 模型字段标签解析在模型定义中,我们可以通过在字段上添加标签来指定字段的属性和约束。常用的标签包括:gorm:"column:column_name":指定字段在数据库中的列名。...钩子函数在 GORM 中,钩子函数可以在数据库操作的不同阶段执行自定义的逻辑,常见的钩子函数包括创建前钩子、更新前钩子、删除前钩子和查询后钩子。...在方法中,我们可以对要删除的记录进行一些处理,例如级联删除相关联的记录等。8.4 查询后钩子在 GORM 中,查询后钩子可以使用 AfterFind() 方法。
理论上 ORM 可以让我们脱离 SQL,但实际上还是需要懂 SQL 才能更好地使用 ORM。 2.GORM 是什么 GORM 是一个流行的 Golang ORM 库。...go get -u gorm.io/driver/postgres go get -u gorm.io/driver/sqlserver 驱动包按照自己实际使用的 DB 选择即可。...如果想更改表名,可以通过在模型结构体上添加 TableName() 方法来自定义表名称。..., price).Count(&c).Error return c, err } 查询记录是否存在 在 GORM 中,可以使用 Count 方法来判断一个查询是否返回了记录。...return true, nil } 使用 Count 方法可以在不加载实际记录的情况下检查是否存在记录。这种方法比使用 First 方法更高效,尤其是在需要检查大量记录是否存在的情况下。
在EasyDSS开发过程中,将数据写入到数据库时,有大量相同的操作。如以下两个步骤设置更新时间和创建时间。...因此为了精简代码,优化结构,可以使用gorm 库的hooks钩子函数功能进行优化。...gorm 为 Go 语言的数据库 orm 框架,需要在项目中创建对应的结构体,结构体如下: // 基础表 type Table struct { // id 为字符串,使用 uuid 或者 xid..." gorm:"type:datetime"` } 现在的需求是希望在创建和更新数据的时候自动更新 CreateAt 和 UpdateAt 字段,而不用每次都显示调用赋值语句。...gorm1.20.x 以上的版本中提供了 BeforeCreate、BeforeUpdate、AfterCreate 等钩子函数可以实现此功能。
/golang.org/x/crypto/bcrypt 方案2:scrypt(参考资料中的专家方案) https://pkg.go.dev/golang.org/x/crypto/scrypt 本文采用方案...1进行明文密码的加密操作,Bcrypt是单向Hash加密算法,此算法对于同一个明文密码,每次生成的hash不一样,每次加密,都会采用不同的盐值来进行加密,最后返回的 hash 值包含盐值等信息的密文。...加密级别系数,越大越安全但性能开下也随之增大 密码验证 bcrypt.CompareHashAndPassword([]byte(hash), []byte(password)) 参数1 为保存在数据库中的密码...钩子介绍使用 参考资料 gorm.io/zh_CN/docs/hooks.html 使用钩子来实现密码加密后存库,我们之前使用的方式 data.Password = BcryptPW(data.Password...),替换成钩子后,框架会在写入库前,自动调用钩子函数,来将密码进行加密处理: 加密及钩子在项目中的使用 model/User.go package model import ( "ginVue3blog
这个就是坑1 查询单个记录时使用了TableName()返回的表名,而在查询结果为Array时,表名在TableName()的基础上又添加了前缀。...每种类型的回调函数放在单独的文件里,比如查询回调函数在gorm/callback_query.go, 创建的在gorm/callback_create.go db.First() 代码分析 First(..., 而默认值的初始化在gorm/callback_query.go的init()方法中, 查询方法为queryCallback, 而queryCallback()方法又调用到scope.prepareQuerySQL...(tabler)先判断是否实现了tabler接口,有则调用其TableName()取值;否则的话从结构体的名字来生成表名。...问题2 DefaultTableNameHandler()在多数据库时出现混乱 通过以上代码的分析,于是发现了另一个坑:当一个程序中使用两个不同的数据库时, 重写方法DefaultTableNameHandler
通过 ORM 技术,我们可以将关系数据库中某个数据表的结构关联到某个类/结构体上,并通过修改类/结构体实例的方式轻易的完成数据库增删改查(CRUD)的任务。...使用 GORM GORM 增删改查 GORM 并不包含在 Go 标准库中,因此,我们需要先安装 GORM 及需要连接对应数据库的驱动。...Gorm 官方支持的数据库类型有:MySQL, PostgreSQL, SQlite, SQL Server。...举个例子,假设有一个电商网站数据库,涉及创建订单和配置库存两个操作,如果创建订单完成后配置库存失败了,那么理论上创建订单也应该被自动回滚以避免数据不一致,通过事务系统,我们可以将这两个操作划入一个事务,...什么是 RPC RPC(Remote procedure call,远程过程调用)是指计算机程序导致过程(子例程)在不同的地址空间(通常在共享网络上的另一台计算机上)中执行,其编码就像普通(本地)过程调用一样
GORM 将生成单独一条SQL语句来插入所有数据,并回填主键的值,钩子方法也会被调用。...{CreateBatchSize: 1}).Create(users) ---- 创建钩子 GORM 允许用户定义的钩子有 BeforeSave, BeforeCreate, AfterSave, AfterCreate...创建记录时将调用这些钩子方法,请参考 Hooks 中关于生命周期的详细信息 钩子方法常与模板方法模式搭配使用,通常暴露给用户自定义相关组件,以此提高框架整体可扩展性 func (u *User)...,且主键也不会自动填充 ---- 使用 SQL 表达式、Context Valuer 创建记录 GORM 允许使用 SQL 表达式插入数据,有两种方法实现这个目标。...---- default:(-)标签可以让我们在字段为零值时,忽略该字段的插入。
代码已被折叠,点此展开 handler.go 如你所见,文件名中有一个 handler.go 后缀。在这些代码中,您可以有效地编写处理请求的代码,从数据库中检索请求的数据,进行处理,最后构成响应。...考虑到这一点,在将数据从一个应用程序传输到另一个应用程序之前,我们需要先转换格式,然后才能被新应用程序接受。可以在此 adapter.go 文件中编写此转换函数。...因此在此文件中,我创建了一个函数,该函数以对象的形式返回到数据库的连接,该函数将在 main.go 中调用并传递给所有需要与数据库交互的 API。...可以在 main.go 中简单调用它,如下所示: // 创建一个数据库服务 dbService := db.NewService(dbc) /db/models Models 通常只是普通的 Golang...(nil)) } 代码已被折叠,点此展开 /db/handlers 数据库处理程序在多个地方的代码是相同的,因此调用 GORM 函数时,最好调用一个准备在 API 处理程序中使用的函数。
资源 系列教程 polarisxu.studygolang.com/posts/go/ec… Bind 是 Echo 框架提供的一个方法,用于将请求中的数据绑定到指定的结构体实例上。...安装Gorm 和 mysql驱动 gorm : go中较流行的ORM库....以下是官网描述的特性: 全功能 ORM 关联 (拥有一个,拥有多个,属于,多对多,多态,单表继承) Create,Save,Update,Delete,Find 中钩子方法 支持 Preload、Joins...定义模型,创建表 首先我们在model文件夹下方新建一个user.go的文件 如果数据库中还没有我们需要的表,我们可以使用 gorm 的 AutoMigrate 方法来自动创建表。...` // 在创建时该字段值为零值或者在更新时,使用当前时间戳秒数填充 } 在db文件夹下的db文件中, 新增一个方法 package db import ( "fmt" "gorm.io
资源 系列教程https://polarisxu.studygolang.com/posts/go/echo/basic01-env/Bind 是 Echo 框架提供的一个方法,用于将请求中的数据绑定到指定的结构体实例上...这几个字眼.上方文件的代码, 我们等下去解释.4. 安装air, 热重启Air 是一个为 Go 项目提供自动重载功能的工具。...安装Gorm 和 mysql驱动gorm : go中较流行的ORM库.以下是官网描述的特性:全功能 ORM关联 (拥有一个,拥有多个,属于,多对多,多态,单表继承)Create,Save,Update,...定义模型,创建表首先我们在model文件夹下方新建一个user.go的文件如果数据库中还没有我们需要的表,我们可以使用 gorm 的 AutoMigrate 方法来自动创建表。...,使用当前时间戳秒数填充}在db文件夹下的db文件中, 新增一个方法package dbimport ( "fmt" "gorm.io/gorm" "quick-start/model")var
ORM,即对象关系映射(Object Relational Mapping),可以简单理解为将关系型数据库中的数据表映射为编程语言中的具体的数据类型(如struct),而GORM库就是一个使用Go语言实现的且功能非常完善易使用的...数据库自动迁移 自定义日志 可扩展性, 可基于 GORM 回调编写插件 如何安装 安装GORM非常简单,使用go get -u就可以在GOPATH目录下安装最新GROM框架。...,我们在init方法中初始化gorm.DB结构体,这样在下面的例子可以直接使用变量db直接进行数据库操作。...其实gorm.DB是在Go语言的database/sql库中的sql.DB结构体上再封装,因为gorm.DB提供许多和sql.DB一样的方法,如下所示: func (s *DB) Exec(sql string...结构体中的DB()方法,可以返回一个sql.DB对象,如下: func (s *DB) DB() *sql.DB 下面演示的是使用gorm.DB结构体中一些更简便的方法进行数据库基本操作,不过,在演示之前
GORM 允许用户定义的钩子有 BeforeSave, BeforeCreate, AfterSave, AfterCreate 创建记录时将调用这些钩子方法,请参考 Hooks 中关于生命周期的详细信息..., "Antonio").Scan(&result) 三、Read 高级选项 3.1 智能选择字段 GORM 允许通过 Select 方法选择特定的字段,如果您在应用程序中经常使用此功能,你也可以定义一个较小的结构体..., 1).Updates(map[string]interface{}{"active": false}) 5.6 在 Update 时修改值 若要在 Before 钩子中改变要更新的值,如果它是一个完整的更新...`deleted_at` IS NULL 个人感觉还是用指针比较好,在平时Go开发中,遇事不决就用指针,没毛病....拥有软删除能力的模型调用 Delete 时,记录不会被数据库。但 GORM 会将 DeletedAt 置为当前时间, 并且你不能再通过普通的查询方法找到该记录。
数据持久化是服务的必要特性,最常见的组件就是关系型数据库MySQL。而在Go语言里,GORM已经成了对接MySQL事实上的标准,那么也就不去横向对比其它库了。...GORM库是一个很强大、但同时也是一个非常复杂的工具。为了支持复杂的SQL语言,它比之前的配置文件加载工具github.com/spf13/viper要复杂不少。...函数 1.MySQL工具库的必要功能 对于MySQL数据库来说,我们对它的日常操作其实就关注在CRUD上(也就是增删改查)。...,是否应该把它引入到模型的定义中 // 我个人不太喜欢将这四个字段强定义为数据库表中的字段名 type Model struct { ID uint `gorm:"primarykey"...` CreatedAt time.Time UpdatedAt time.Time DeletedAt DeletedAt `gorm:"index"` } 从上面的一些操作可以看到,我推荐的使用方式有
Gorm是一个灵活且功能强大的ORM库,它支持多种方式进行数据库操作,包括常规的增删改查操作、事务处理、并发控制等。除了提供丰富的内置方法外,Gorm还允许我们自定义查询方法以满足更复杂的查询需求。...全局作用域定义全局作用域的自定义查询方法很简单,只需要调用gorm.DB结构体上的QueryExpr方法即可,该方法定义了一个全局作用域的查询表达式。...模型作用域定义模型作用域的自定义查询方法需要在模型结构体上定义一个方法,该方法返回一个*gorm.DB类型的对象。...在使用该自定义查询方法时,我们需要通过模型结构体来调用该方法:var users []Userdb.Find(&users)var tomUsers []Userdb.Model(User{}).FindByName...自定义查询方法的使用自定义查询方法可以像内置方法一样与其他Gorm方法一起使用,包括条件查询、分页查询、关联查询等。我们只需要在查询语句中添加自定义查询方法即可。
另外,上面表格测试代码框架是用Goland自动生成的,自己只需要填写tests数组就行了。点击函数名然后右键,选择generate,然后选择test for function就会自动生成测试函数了。...}) })} 可以看到,mock依赖函数之后执行被测函数,会返回我们设置的错误fake error,在调用完成获得返回错误之后可以判断一下是否是我们设置的错误。...七、mysql 数据库依赖 数据库依赖也是经常要遇到的一个问题,如何解决测试过程中的依赖呢?...可以本地临时创建一个sqlite数据库来代替当前依赖的数据库比如mysql等,sqlite是可以在本地直接跑的轻量级数据库,常见sql语句增删改查什么的和mysql区别不大。...如下所示首先创建一个临时的sqlite gorm框架DB,其中连接地址置空,这样在关闭db之后数据库也会自动删除。之后就可以正常使用了。
前言 所有的后端应用都离不开数据库的操作,在Go中也有一些好用的数据库操作组件,例如Gorm就是一个很不错的选择。...当然Gorm本身的官方文档已经非常详细了,如果对本文中的部分Gorm使用有稍许疑惑的话,请移步官方文档:https://gorm.io/zh_CN/docs/index.html 安装 在控制台执行go...Gorm官方支持的数据库类型有:MySQL, PostgreSQL, SQlite, SQL Server go get -u gorm.io/gorm go get -u gorm.io/driver...,在使用时直接调用即可,而不需要再次进行数据库的初始化。...使用User.TableName表名数据库名,当使用Model绑定结构体时,Gorm会默认调用该方法,除此之外,还可以使用db.Table("user")显式的标明表名。
默认关闭事务 GORM 默认的数据更新、创建都在事务中,如无必要,可以关闭默认的事务,获得更大的性能提升, 事务的全局性或者临时关闭,即使在关闭默认事务,仍然可以通过方法 Begin, Transactions...// 注意,一旦你在一个事务中,使用tx作为数据库句柄 if err := tx.Create(&Animal{Name: "Giraffe"}).Error; err !...result.Error // 更新的错误 检查字段是否有变更 GORM 提供了 Changed 方法,它可以被用在 Before Update Hook 里,它会返回字段是否有变更的布尔值...这个场景常用于数据加密,解密 若要在 Before 钩子中改变要更新的值,如果它是一个完整的更新,可以使用 Save;否则,应该使用 SetColumn ,例如: func (user *User)...struct 查询时,将会自动添加较小 struct 的字段到查询的 Select 当中,来减少需查询的字段数量,因此对于 API 来说,可以定义一个较小对象来来减少不必要的字段查询,例如: type
资料库迁移问题:针对 MySQL 开发的 SQL 语句就没办法直接应用到 Oracle 上的资料库。...ORM 优缺点优点提高开发效率缺点牺牲性能牺牲灵活性安装接下来回到这篇文章的主体gorm上,这里先进行安装 go get -u gorm.io/gorm go get -u gorm.io/driver...表名:默认情况下,GORM 将结构体名称转换为 snake_case 并为表名加上复数形式。 例如,一个 User 结构体在数据库中的表名变为 users 。...列名:GORM 自动将结构体字段名称转换为 snake_case 作为数据库中的列名。时间戳字段:GORM使用字段 CreatedAt 和 UpdatedAt 来自动跟踪记录的创建和更新时间。...连接数据库目前GORM 官方支持的数据库类型有:MySQL, PostgreSQL, SQLite, SQL Server 和 TiDB,基本把常用数据库都涵盖了。
领取专属 10元无门槛券
手把手带您无忧上云