首页 > 数据库 >[小白入门指南] 如何使用gorm操作MySQL

[小白入门指南] 如何使用gorm操作MySQL

时间:2023-12-07 15:47:33浏览次数:53  
标签:入门 使用 db 更新 MySQL jinzhu gorm users

1. 使用gorm的前置条件

1.1 MySQL的安装和配置

Debian中安装MySQL
| MySQL创建用户并授予权限

#用rpm查看是否安装了MySQL
rpm -qa | grep mysql

#用ps命令查看是否有MySQL进程
ps -ef | grep mysql

##########拓展小知识##############
linux系统基本上分两大类,RedHat系列和Debian系列。
RedHat系列:有Redhat、Centos、Fedora等。
Debian系列:有Debian、Ubuntu等 。
RedHat 系列常见的安装包格式 rpm包,安装rpm包的命令是“rpm -参数”。
    包管理工具 yum。
    支持tar包 。
Debian系列常见的安装包格式 deb包,安装deb包的命令是“dpkg -参数”。
    包管理工具 apt-get。
    支持tar包 。
sudo systemctl status mysql                                    查看 mysql 状态
mysql -u root -p              密码:123456                      更改为账号密码登录方式
CREATE USER 'username1'@'%' IDENTIFIED BY 'password1';         创建用户
GRANT ALL ON db1.* TO username1@'%' WITH GRANT OPTION;         给用户赋予权限

1.2 Naviacte For MySQL 16

navicat for mysql 16 无限试用

1.win+R打开运行,输入 regedit 打开注册表

2.HKEY_CURRENT_USER\SOFTWARE\PremiumSoft\Navicat\Registration16XCS
删除 Registration16XCS 中所有的内容, Registration16XCS不删除

3.如果存在 HKEY_CURRENT_USER\SOFTWARE\PremiumSoft\Navicat\Update
删除 Update

4.HKEY_CURRENT_USER\Software\Classes\CLSID{xxx-xxx-xxx-xxx-xxx}
找到一个包含Info的 , 删除 Info

2. gorm基本操作

gorm官方文档见文末。

2.1 添加

默认值

可以通过设置default标签设置默认值,设置了该标签会填充值为零值的字段。若要在迁移时跳过默认值定义,你可以使用 default:(-)

注意
对于声明了默认值的字段,像 0、''、false 等零值是不会保存到数据库。您需要使用指针类型或 Scanner/Valuer 来避免这个问题,

创建记录

创建记录的几种方法:
Create方法的参数可以是结构体指针也可以是结构体值类型,官方的例子都是使用的指针类型。

  • 使用对象指针创建:db.Create(&user)
  • 指定字段创建记录,未指定的字段为null:db.Select("Name", "Age", "CreatedAt").Create(&user)
  • 忽略指定的字段创建记录,被忽略的设置为null:db.Omit("Name", "Age", "CreatedAt").Create(&user)
  • 批量插入,传入一个切片:db.Create(&users)
  • 分批批量插入,传入一个切片,可以指定每批的数量:db.CreateInBatches(users, 100)
  • 根据map创建(好处是可以不用创建对象,更方便。但是参数的传递很不方便。比较适合后端批量插入):
   db.Model(&User{}).Create(map[string]interface{}{
     "Name": "jinzhu", "Age": 18,
   })
   
   // batch insert from `[]map[string]interface{}{}`
   db.Model(&User{}).Create([]map[string]interface{}{
     {"Name": "jinzhu_1", "Age": 18},
     {"Name": "jinzhu_2", "Age": 20},
   })
  • 使用SQL表达式、Context Valuer 创建记录(未记录)

高级选项

  • 钩子操作:GORM 允许用户定义的钩子有 BeforeSave, BeforeCreate, AfterSave,
    AfterCreate 创建记录时将调用这些钩子方法,请参考 Hooks 中关于生命周期的详细信息
    如果您想跳过 钩子 方法,您可以使用 SkipHooks 会话模式,例如:
DB.Session(&gorm.Session{SkipHooks: true}).Create(&user)
  • 关联创建:创建关联数据时,如果关联值是非零值,这些关联也会被创建,且他们的Hook方法也会被调用
  type CreditCard struct {
  gorm.Model
  Number   string
  UserID   uint
  }
  
  type User struct {
  gorm.Model
  Name       string
  CreditCard CreditCard
  }
  
  db.Create(&User{
  Name: "jinzhu",
  CreditCard: CreditCard{Number: "411111111111"}
  })
  // INSERT INTO `users` ...
  // INSERT INTO `credit_cards` ...
  • Upsert及冲突(未记录)

2.2 查找

指定查询字段

使用Select()指定检索的字段,默认检索所有字段。

查询形式

  • 通过gorm提供的函数直接获取,比如First()Last()
  • String条件:使用Where()函数进行条件判断,参数通过 String 提供
  • Struct & Map条件:使用Where()函数进行判断,参数通过Struct 或 Map提供。使用struct时,
    对零值(0,'',false等)不进行查询。

查询方法

  • 查询单条记录:First()(主键升序第一条)、Last()(主键降序第一条)、Take()(没有指定排序字段)。
    没有找到记录时,它会返回 ErrRecordNotFound 错误。函数参数需要为结构体的指针类型或者使用db.model()
    指定model才能生效。如果model没有指定主键,那么将按照model的第一个字段排序。
  • 根据主键获取
db.First(&user, 10)
// SELECT * FROM users WHERE id = 10;
db.Find(&users, []int{1,2,3})
// SELECT * FROM users WHERE id IN (1,2,3);
// 如果主键是字符串
db.First(&user, "id = ?", "1b74413f-f3b8-409f-ac47-e8c062e3472a")
// SELECT * FROM users WHERE id = "1b74413f-f3b8-409f-ac47-e8c062e3472a";
  • 检索全部对象:db.Find()

查询筛选

  • 内联条件筛选:查询条件也可以内联到First()Find()之类的方法中,用法类似于Where(),可以使用String、Struct、Map方式提供查询条件
  • 非条件筛选Not()
  • 或条件筛选Or()
  • 排序筛选Order(),字段排序规则在Order函数中通过字符串选择
  • Limit & OffsetLimit()指定要检索的最大记录数。 Offset()指定在开始返回记录前要跳过的记录数。
  • Group By & Having:分组筛选和条件筛选
  • Distinct:从model中选择特定的值
  • Joins:(未记录)
  • Joins 预加载:(未记录)
  • Joins 一个衍生表:(未记录)
  • ScanScan() 结果至 struct,用法与 Find 类似

2.3 更新

更新方法

  • 保存所有字段Save 会保存所有的字段,即使字段是零值
db.First(&user)

user.Name = "jinzhu 2"
user.Age = 100
db.Save(&user)
// UPDATE users SET name='jinzhu 2', age=100, birthday='2016-01-01', updated_at = '2013-11-17 21:34:10' WHERE id=111;
  • 更新单个列:当使用 Update 更新单个列时,你需要指定条件,否则会返回 ErrMissingWhereClause 错误。
    当使用了 Model 方法,且该对象主键有值,该值会被用于构建条件。
  • 更新多列Updates 方法支持 structmap[string]interface{} 参数。当使用 struct 更新时,默认情况下,GORM 只会更新非零值的字段。
    如果想要确保指定字段被更新,应该使用Select更新选定字段,或使用map来完成更新操作。
  • 更新选定字段Select选定更新字段,Omit选定忽略字段。
  • 更新Hook:对于更新操作,GORM 支持 BeforeSaveBeforeUpdateAfterSaveAfterUpdate 钩子。
  • 批量更新:不使用model指定主键则进行批量更新。没有任何条件的情况下gorm默认不会执行批量更新,对此
    可以通过1.加一些条件 2.使用原生SQL 3.启用AllowGlobalUpdate模式来开启批量更新。例如:
db.Model(&User{}).Update("name", "jinzhu").Error // gorm.ErrMissingWhereClause

db.Model(&User{}).Where("1 = 1").Update("name", "jinzhu")
// 1.通过加条件解决 UPDATE users SET `name` = "jinzhu" WHERE 1=1    

db.Exec("UPDATE users SET name = ?", "jinzhu")
// 2.通过原生SQL解决 UPDATE users SET name = "jinzhu"

db.Session(&gorm.Session{AllowGlobalUpdate: true}).Model(&User{}).Update("name", "jinzhu")
// 3.通过开启AllowGlobalUpdate模式解决 UPDATE users SET `name` = "jinzhu"
  • 高级选项
    • 使用SQL表达式更新(未记录)
    • 使用子查询进行更新
    • 不使用Hook和时间追踪:如果您想在更新时跳过 Hook 方法且不追踪更新时间,可以使用 UpdateColumnUpdateColumns,其用法类似于 UpdateUpdates
    • 返回修改行的数据:可以更新数据并将选定的字段赋值给对象,不指定字段则默认全部。
    • 检查字段是否有变更Changed方法,它可以被用在 Before Update Hook 里,
      Changed 方法只能与 UpdateUpdates 方法一起使用,
      并且它只是检查字段本身的值与更改之后的值是否相同,如果不同,且字段没有被忽略,则返回 true,反之返回false
    • Update时修改值:若要在 Before 钩子中改变要更新的值,如果它是一个完整的更新,可以使用 Save;否则,应该使用 SetColumn

2.4 删除

  • 删除一条记录:Delete,删除时需要指定主键,否则会批量删除
  • 根据主键删除:

2.5 gorm迁移

迁移过程中自定义类型的迁移参考:

Go gorm| MySQL不支持数组/切片怎么办?

GORM 字段使用自定义类型


gorm官方文档

标签:入门,使用,db,更新,MySQL,jinzhu,gorm,users
From: https://www.cnblogs.com/yxl19991104/p/17882094.html

相关文章

  • Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) MySql字符集及校对规则不
    查询时报错--用于解决报错>1267-Illegalmixofcollations(utf8mb4_0900_ai_ci,IMPLICIT)and(utf8mb4_general_ci,IMPLICIT)foroperation'='这个错误是由于在进行比较操作时涉及到不同的字符集和校对规则(collations)。涉及到了utf8mb4_0900_ai_ci和utf8mb4_general......
  • go-zero 开发入门-加法客服端示例
    定义RPC接口文件接口文件add.proto的内容如下:syntax="proto3";packageadd;optiongo_package="./add";messageAddReq{int32a=1;int32b=2;}messageAddResp{int32sum=1;}serviceAdder{rpcadd(AddReq)returns(A......
  • PWN入门之Stack Overflow
    本文是i春秋论坛签约作家「Binarystar」分享的技术文章,旨在为大家提供更多的学习方法与技能技巧,文章仅供学习参考。大家好,我是Binarystar,目前从事于公安行业,擅长Web、二进制和电子取证方向。能把网络安全技能运用在工作中,与我的职业结合起来做有意义的事,是非常自豪的,我希望通......
  • Spring入门04Bean的配置、Bean的实例化、Bean的生命周期、依赖注入方式、依赖自动装配
    bean配置bean基础配置 bean别名配置 bean作用范围配置  bean实例化bean是如何创建的bean实例化bean本质上就是对象,创建bean使用构造方法完成 实例化bean的三种方式 bean生命周期bean生命周期控制   依赖注入方式依赖注入的两种方式......
  • 在.net中通过自定义LoggerProvider将日志保存到数据库方法(以mysql为例)
     在.NET中,Microsoft.Extensions.Logging是一个灵活的日志库,它允许你将日志信息记录到各种不同的目标,包括数据库。在这个示例中,我将详细介绍如何使用Microsoft.Extensions.Logging将日志保存到MySQL数据库。我们将使用EntityFrameworkCore来与MySQL数据库进行交互。步骤一:创......
  • HydroOJ 从入门到入土(4)控制面板-系统设置详解
    控制面板内众多配置项眼花缭乱,至于说明文档...这个真没有!这里的配置有很多,如果装了插件,有一些插件的配置项也是在这里修改,所以很有必要了解一下这些选项都是干什么的.目录SMTP设置服务器设置setting_limits各种保护性限制基础设置Session设置hydroojui-default显......
  • 浅析MySQL代价模型:告别盲目使用EXPLAIN,提前预知索引优化策略
    背景在MySQL中,当我们为表创建了一个或多个索引后,通常需要在索引定义完成后,根据具体的数据情况执行EXPLAIN命令,才能观察到数据库实际使用哪个索引、是否使用索引。这使得我们在添加新索引之前,无法提前预知数据库是否能使用期望的索引。更为糟糕的是,有时甚至在添加新的索引后,数......
  • Python 操作 MySQL 数据库
    Python标准数据库接口为PythonDB-API,PythonDB-API为开发人员提供了数据库应用编程接口。Python数据库接口支持非常多的数据库,你可以选择适合你项目的数据库:GadFlymSQLMySQLPostgreSQLMicrosoftSQLServer2000InformixInterbaseOracleSybase你可以访问Python数据库接口及API......
  • MySQL数据库中SQL语句分几类?
    SQL语句主要分为四类,分别是数据查询语言(DQL)、数据操作语言(DML)、数据定义语言(DDL)和数据控制语言(DCL)。1.数据查询语言(DQL):用于从数据库中的一个或多个表中查询数据,主要使用SELECT语句。2.数据操作语言(DML):用于修改数据库中的数据,包括插入(INSERT)、更新(UPDATE)和删除(DELETE)等操作。3.数......
  • linux 安装mysql
    1、到指定目录下下载安装包[root@master~]#cd/usr/local/src2、下载mysql8[root@mastersrc]#wgethttps://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz 3、解压mysql8,通过xz命令解压出tar包(这里时间可能会久一点根据服务器......