Go语言使用的ORM框架:Gorm的一些简单用法

比较 Go 中的 7 个最佳 ORM 包 对象关系映射器 (ORM) 是提供使用首选编程语言的数据类型和语法与 SQL 数据库交互的功能的工具。您可以使用 ORM 对数据库进行操作,而无需编写纯 SQL,因为典型的 ORM 提供了数据库抽象。使用 ORM 代替使用内置数据类型的数据库有很多好处。例如,您可以将任何受支持的数据库与 ORM 一起使用,而无需对现有代码进行大量更改。此外,ORM 提高了开发人员的生产力并降低了开发成本。 阅读详情

建立连接

这里以mysql为例,需要导入这两个包

import(
	_ "github.com/go-sql-driver/mysql"
	"github.com/jinzhu/gorm"
)

然后就可以直接建立连接了:

	db,err := gorm.Open("mysql","root:password@tcp(127.0.0.1:3306)/mysql?charset=utf8")
	db.SingularTable(true)
	defer db.Close()
	if err!=nil{
		panic(err)
	}

Open函数里面的"mysql"表明是要连接什么数据库,后面的root,password是账户密码,tcp后面的是ip和端口号,/mysql是本次连接要打开的项目。
db.SingularTable(true),如果不设置这个参数,gorm会把表名转义后加个s,导致找不到表。

操作表

定义一个结构体,对应一张表,这里就是一张很简单的表,只有两列,username和balance,一个是varchar类型,一个是int类型;

type User struct {
	Username string
	Balance int
}

这里的结构体和表一定要一一对应,变量名首字母要大写,否则找不到对应的元素。
例子:可以自己尝试组合使用

//create
	var user User
	user.Username="wuhaotian"
	user.Balance = 1000
	db.Create(&user)
//read
	db.First(&user,"username=?","lisi")
//update
	db.Model(&user).Where("username=?","lisi").Update("balance",2000)

查询:

// 获取第一条记录,按主键排序
db.First(&user)
//// SELECT * FROM users ORDER BY id LIMIT 1;

// 获取最后一条记录,按主键排序
db.Last(&user)
//// SELECT * FROM users ORDER BY id DESC LIMIT 1;

// 获取所有记录
db.Find(&users)
//// SELECT * FROM users;

// 使用主键获取记录
db.First(&user, 10)
//// SELECT * FROM users WHERE id = 10;这里默认表里面有id这一例,如果没有的话,就查不到。

Where查询条件

// 获取第一个匹配记录
db.Where("name = ?", "jinzhu").First(&user)
//// SELECT * FROM users WHERE name = 'jinzhu' limit 1;

// 获取所有匹配记录
db.Where("name = ?", "jinzhu").Find(&users)
//// SELECT * FROM users WHERE name = 'jinzhu';

db.Where("name <> ?", "jinzhu").Find(&users)

// IN
db.Where("name in (?)", []string{"jinzhu", "jinzhu 2"}).Find(&users)

// LIKE
db.Where("name LIKE ?", "%jin%").Find(&users)

// AND
db.Where("name = ? AND age >= ?", "jinzhu", "22").Find(&users)

// Time
db.Where("updated_at > ?", lastWeek).Find(&users)

db.Where("created_at BETWEEN ? AND ?", lastWeek, today).Find(&users)

Where查询条件(Struct & Map)

// Struct
db.Where(&User{Name: "jinzhu", Age: 20}).First(&user)
//// SELECT * FROM users WHERE name = "jinzhu" AND age = 20 LIMIT 1;

// Map
db.Where(map[string]interface{}{"name": "jinzhu", "age": 20}).Find(&users)
//// SELECT * FROM users WHERE name = "jinzhu" AND age = 20;

// 主键的Slice
db.Where([]int64{20, 21, 22}).Find(&users)
//// SELECT * FROM users WHERE id IN (20, 21, 22);

Not条件查询

db.Not("name", "jinzhu").First(&user)
//// SELECT * FROM users WHERE name <> "jinzhu" LIMIT 1;

// Not In
db.Not("name", []string{"jinzhu", "jinzhu 2"}).Find(&users)
//// SELECT * FROM users WHERE name NOT IN ("jinzhu", "jinzhu 2");

// Not In slice of primary keys
db.Not([]int64{1,2,3}).First(&user)
//// SELECT * FROM users WHERE id NOT IN (1,2,3);

db.Not([]int64{}).First(&user)
//// SELECT * FROM users;

// Plain SQL
db.Not("name = ?", "jinzhu").First(&user)
//// SELECT * FROM users WHERE NOT(name = "jinzhu");

// Struct
db.Not(User{Name: "jinzhu"}).First(&user)
//// SELECT * FROM users WHERE name <> "jinzhu";

带内联条件的查询

注意:使用主键查询时,应仔细检查所传递的值是否为有效主键,以避免SQL注入

// 按主键获取
db.First(&user, 23)
//// SELECT * FROM users WHERE id = 23 LIMIT 1;

// 简单SQL
db.Find(&user, "name = ?", "jinzhu")
//// SELECT * FROM users WHERE name = "jinzhu";

db.Find(&users, "name <> ? AND age > ?", "jinzhu", 20)
//// SELECT * FROM users WHERE name <> "jinzhu" AND age > 20;

// Struct
db.Find(&users, User{Age: 20})
//// SELECT * FROM users WHERE age = 20;

// Map
db.Find(&users, map[string]interface{}{"age": 20})
//// SELECT * FROM users WHERE age = 20;

Or条件查询

db.Where("role = ?", "admin").Or("role = ?", "super_admin").Find(&users)
//// SELECT * FROM users WHERE role = 'admin' OR role = 'super_admin';

// Struct
db.Where("name = 'jinzhu'").Or(User{Name: "jinzhu 2"}).Find(&users)
//// SELECT * FROM users WHERE name = 'jinzhu' OR name = 'jinzhu 2';

// Map
db.Where("name = 'jinzhu'").Or(map[string]interface{}{"name": "jinzhu 2"}).Find(&users)

Select

db.Select("name, age").Find(&users)
//// SELECT name, age FROM users;

db.Select([]string{"name", "age"}).Find(&users)
//// SELECT name, age FROM users;

db.Table("users").Select("COALESCE(age,?)", 42).Rows()
//// SELECT COALESCE(age,'42') FROM users;

Count

获取模型的记录数

db.Where("name = ?", "jinzhu").Or("name = ?", "jinzhu 2").Find(&users).Count(&count)
//// SELECT * from USERS WHERE name = 'jinzhu' OR name = 'jinzhu 2'; (users)
//// SELECT count(*) FROM users WHERE name = 'jinzhu' OR name = 'jinzhu 2'; (count)

db.Model(&User{}).Where("name = ?", "jinzhu").Count(&count)
//// SELECT count(*) FROM users WHERE name = 'jinzhu'; (count)

db.Table("deleted_users").Count(&count)
//// SELECT count(*) FROM deleted_users;

Group & Having

rows, err := db.Table("orders").Select("date(created_at) as date, sum(amount) as total").Group("date(created_at)").Rows()
for rows.Next() {
    ...
}

rows, err := db.Table("orders").Select("date(created_at) as date, sum(amount) as total").Group("date(created_at)").Having("sum(amount) > ?", 100).Rows()
for rows.Next() {
    ...
}

type Result struct {
    Date  time.Time
    Total int64
}
db.Table("orders").Select("date(created_at) as date, sum(amount) as total").Group("date(created_at)").Having("sum(amount) > ?", 100).Scan(&results)

Join

指定连接条件

rows, err := db.Table("users").Select("users.name, emails.email").Joins("left join emails on emails.user_id = users.id").Rows()
for rows.Next() {
    ...
}

db.Table("users").Select("users.name, emails.email").Joins("left join emails on emails.user_id = users.id").Scan(&results)

// 多个连接与参数
db.Joins("JOIN emails ON emails.user_id = users.id AND emails.email = ?", "jinzhu@example.org").Joins("JOIN credit_cards ON credit_cards.user_id = users.id").Where("credit_cards.number = ?", "411111111111").Find(&user)

Scan

先定义另外的结构体(或者变量),将结果扫描到另一个结构(变量)中。

type Result struct {
    Name string
    Age  int
}

var result Result
db.Table("users").Select("name, age").Where("name = ?", 3).Scan(&result)

// Raw SQL
db.Raw("SELECT name, age FROM users WHERE name = ?", 3).Scan(&result)

更多操作可以看gorm官网

go语言gorm基本使用 文章目录一、使用形式二、查询操作1、模型2、简单查询3、Select查询4、where查询(简单sql)5、where查询(struct&map)6、not条件查询7、带内联条件的查询8、Or条件查询9、链式查询10、扩展查询选项11、Order语句12、Limit语句13、Offset语句14、Count语句15、Group & Having16、Join语句17、Pluck语句18、Scan语句19、 Scopes语句20、指定表名21、预加载22、自定义预加载SQL23、嵌套预加载三、 阅读详情

相关推荐

GORM 性能基准测试:Golang ORM 框架比较

在高并发或大数据量的业务场景中,ORM框架的性能差异可能成为系统瓶颈。本文通过控制变量的基准测试GORM的“全功能特性”是否以性能为代价?代码生成类ORM(如SQLBoiler、SQLC)是否真的更快?轻量级ORM(如XORM)在简单场景下是否更有优势?测试范围覆盖单条记录操作、批量插入/查询、关联查询、原生SQL执行四大核心场景,数据库选择最常用的MySQL 8.0。本文从“ORM核心概念”入手,通过生活案例解释不同ORM的设计差异;

AI Agent Harness Engineering 1397

【GORM框架】ORM介绍、GORM简单连接和高级配置详解

ORM的全称是:Object Relational Mapping(对象关系映射)其中对象:指的是程序中对象/实例(在Go程序中就是结构体实例)关系:指的是关系型数据库(如Mysql)映射:也就是指程序中的对象、实例在数据库中的映射(这个实例映射到数据库中是某个实例)一个类/结构体,对应数据库的一张表类/结构体的实例化,对应这张表的一条记录。

Yaoyao2024的博客 2239

Go 语言 ORM 王者 GORM:从入门到精通的保姆级教程

在 GORM 中,一个 Go 结构体(Struct)就代表数据库中的一张表。字段的映射关系则通过“结构体标签(Struct Tag)”来定义。我们来创建一个User模型,它将对应数据库中的users表。import ("time"// User 模型定义gorm.Model // 内嵌 gorm.Model,它包含了 ID, CreatedAt, UpdatedAt, DeletedAt 四个字段not null"`not null"`模型解析gorm.Model。

dl999666的博客 1754

Go入门之Gorm 框架

gorm是Golang语言中一款性能极好的ORM库,对开发人员相对是比较友好的。当然还有另外一个xorm库也是比较出名的,感兴趣的也可以看看这个库,接下来主要介绍下gorm库的一些基本使用。下面我们一起看看如何安装这个gorm框架,然后快速的把它使用起来//安装MySQL驱动 go get - u gorm . io / driver / mysql go get - u github . com / jinzhu / gorm。

qq_56999918的博客 1万+

Go orm框架gorm学习

之前咱们学习过原生的Go连接MYSQL的方法,使用Go自带的"database/sql"数据库连接api,"github.com/go-sql-driver/mysql"MYSQL驱动,通过比较原生的写法去写sql和处理事务。目前开源界也有很多封装好的orm操作框架,帮我们简省一些重复的操作,提高代码可读性。gorm就是这样的一款作品,我们来学习一下gorm的操作流程。 安装 go get -u ...

rickiyang的博客 4583

GORM入门:轻松掌握Go语言ORM框架(一)

GORM是Go语言中功能强大的ORM框架,支持多种数据库系统

liushen0528的博客 1158

探索Gorm - Golang流行的数据库ORM框架

Gorm是一款用于Golang的ORM框架,它提供了丰富的功能。作者:鼠鼠我捏,要死了捏

qq_35716689的博客 33万+

Go语言框架db-GORM

本文是李文周的博客go语言学习之路的目录提要版,方便复习查看使用,原文参见文章连接: https://www.liwenzhou.com/posts/Go/go_menu/ gorm是一个使用Go语言编写的ORM框架。它文档齐全,对开发者友好,支持主流数据库。 GORM总结 安装 go get -u github.com/jinzhu/gorm 连接数据库 连接不同的数据库都需要导入对应数据的驱...

weixin_42426385的博客 1657

24 go语言(golang) - gorm框架安装及使用案例详解

定义一个模型,并让GORM为其创建对应的数据表// 自动迁移模式,会创建表结构,如果不存在的话。err := db.AutoMigrate(&DwdUserInfo{}) // 创建的表明是dwd_user_infosif err!= nil {return如果不想要它建表时加个s,可以自定义表名,或者关掉这个配置开关// 通过设置 SingularTable: true,GORM 将使用单数形式作为默认的表名。},})// 或者实现 TableName() 方法来覆盖默认实现:指定主键。

瑞瑞的博客 2458

Go必知必会系列:ORM框架与GORM

作者:禅与计算机程序设计艺术 1.背景介绍 ORM简介 ORM(Object-Relational Mapping)即对象关系映射,是一种用于从关系数据库中获取数据的编程技术。通过ORM框架将关系型数据库中的数据表转换成面向对象的实体类,再用对象的方法来操作实

AI天才研究院 799

Go基础:Go语言ORM框架GORM详解

GORM是Go语言中功能强大的ORM框架,支持MySQL、PostgreSQL等主流数据库。它提供丰富的功能,包括模型定义、CRUD操作、关联处理、事务管理和自动迁移等,同时支持钩子函数和预加载优化。相比原生SQL,GORM虽然存在性能开销,但显著提升了开发效率。安装简单,通过结构体标签定义模型,支持增删改查、事务及复杂查询。其核心优势在于多数据库兼容、开发者友好性及完善的文档支持,适合需要快速开发的场景。

数据知道的博客 5804

Gorm—Go语言数据库框架

Go语言最流行的数据库ORM【对象关系映射】框架。

追求幸福,探索未知的博客 7244

【Golang】Go操作数据库框架gorm

GORM是Go语言中的一个强大的ORM(对象关系映射)库,它提供了简单易用的API来操作数据库。GORM支持多种数据库,如MySQL、PostgreSQL、SQLite等。通过GORM,开发者可以使用Go语言的结构体来映射数据库表,从而简化数据库操作。

景天科技苑 9万+

Go ORM 框架选型:GORM、Ent 和 sqlc 各自适合什么场景

Go 生态的 ORM 选型不像 Java 那样有一个 Hibernate 级别的"标准答案"。GORM 用户基数最大,Ent 来自 Facebook 的实践沉淀,sqlc 则代表了另一种流派——直接从 SQL 生成类型安全的 Go 代码。三者的设计理念差异不是"谁更好"的问题,而是"谁的假设更匹配你的项目"的问题。很多团队在技术选型时只关注"好不好写",忽略了两个更重要的维度:出问题时排查难度、长期维护的代码腐化速度。ORM 生成的那些隐式 SQL,最终会在凌晨三点的 oncall 中变成调试噩梦。

m0_50889382的博客 6661

STM32CubeMX 6.4.0 + STM32F407ZGT6 实战:基于YT8512C PHY的lwIP以太网配置与调试

本文详细介绍了使用STM32CubeMX 6.4.0为STM32F407ZGT6微控制器配置YT8512C PHY芯片,并成功移植lwIP以太网协议栈的实战过程。文章从硬件差异分析入手,逐步讲解时钟配置、ETH外设设置、PHY寄存器适配以及lwIP协议栈剪裁等关键步骤,旨在帮助开发者解决非标准PHY芯片的联网难题,最终实现网络连通与Ping测试。

n8m7b6v5c4的博客 592

RS232/RS485/CAN_BUS 通信原理总结与通信波形分析

分析一:232串口信号要点:RS232,全双工,采用三线制传输分别为TXD\RXD\GND,其中TXD为发送信号,RXD为接收信号。在RS232中任何一条信号线的电压均为负逻辑关系。即:-15v ~ -3v 代表1 +3v ~ +15v 代表0测试结果与分析:如图所示,以传输一个8位二进制数值“01101010”为例,异步传输数据的一般格式为:起始位+校验位+数据位+停止位。其中,校验位为可选项。...

乔木鱼 1万+

golang ORM框架gorm

ORM简介 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库(如mysql数据库)存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。 安装 go get -u gorm.io/gorm 快速入门 package main import ( "gorm.io/gorm" "gorm.io/driver/mysql" ) type Product str

ymxyld的博客 3849

LRTimelapse Pro v7.0.0 激活版下载安装教程 (延迟摄影后期渲染)

LRTimelapse Pro 是一款优秀的高级延时摄影解决方案,使用将为用户提供最全面的工具和功能,从导入和组织您的延时摄影序列、视觉工作流程、在 LRTimelapse 中直接编辑和渲染、视觉去闪烁等等,功能齐全,可以使用 LRTimelapse Pro 编辑多个序列时显著提高您的效率,轻松在 LRTimelapse 中配置和使用色彩管理,进行长期延时编辑,在 LRTimelapse Pro 中使用长期工作流程。为延时编辑、关键帧、分级和渲染提供最全面的解决方案。

wyqshusan的博客 3464

Golang ORM框架 — GORM

定义模型之前先为大家介绍gorm中预置的模型结构体gorm.Model"index"`}该结构体中包含了各种数据库模型共同具有的一些参数,包括主键、创建时间、更新时间和删除时间。我们以go语言的内嵌结构体的形式将其插入到我们的结构体当中。这样gorm就会感知到这些参数的存在,并在一般的数据库操作中为我们自动更新这些参数(PS在进行Query时,gorm会去判断DeletedAt是否为nil,只返回那些DeletedAt不为nil的记录)。...

ElzatAhmed的博客 2516

基于STM32L4XX、HAL库的AD7124模数转换器ADC驱动程序设计

/ 检查ID是否正确 (AD7124-4/AD7124-8有不同的ID)// 转换为电压值 (假设使用内部2.5V基准)// 构造读命令: 1(R/W) + 1(0) + 6(寄存器地址)// 构造写命令: 0(R/W) + 1(0) + 6(寄存器地址).config = 0, // 使用配置0。内置可编程增益放大器(PGA):1-128倍。// 读取ADC数据。// 读取当前ADC控制寄存器。// 检查数据是否就绪。// 写回ADC控制寄存器。// 初始化AD7124。

zhusl6688的博客 519

3、硬件工程师笔试面试学习汇总——器件篇目录(2025版本)

硬件工程师笔试面试学习

XU157303764的博客 7620
上一篇: SpringMVC笔记一:简介+在写Controller时的一些组件介绍和注意点
下一篇: Spring学习:静态代理到动态代理
code_feien
博客等级 码龄7年 71粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值