GORM操作mysql数据库

news2024/11/15 8:31:57

在这里插入图片描述

对象就是程序的数据结构,关系是数据库。就是将程序的数据结构与数据库表对应起来。

在GORM是Go语言的ORM框架,将go的数据结构转化为数据库表,例如将结构体转化为数据库表。

引入gorm框架

  1. 远程下载gorm框架
go get -u gorm.io/driver/mysql
go get -u gorm.io/gorm
  1. 项目中引入
import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)
  1. 引入datasource
datasource := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"

在datasource中配置数据库用户和密码,以及数据库名,其他不用变。在使用数据库驱动连接数据时首先保证数据库存在,需要创建数据库CREATE DATABASE [name]

  1. 数据库驱动连接数据库
drivername := "root:root@tcp(127.0.0.1:3306)/account?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(drivername), &gorm.Config{})

if err != nil {
	fmt.Println("error connect mysql", err)
}

经过上述步骤返回一个数据库驱动,可以用数据驱动操作数据库。

完整步骤如下:

func connMysql() (*gorm.DB) {
	drivername := "root:root@tcp(127.0.0.1:3306)/account?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(drivername), &gorm.Config{})

	if err != nil {
		fmt.Println("error connect mysql", err)
	}
	return db
}

CURD

得到数据驱动后,就可以利用驱动来操作数据库,最常见的就是表的创建与删除,数据的增删改查。

结构体映射数据表

使用gorm框架可以将Go的结构体对应在数据中生成对应的表。

package main

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

func main() {
	db := connMysql()
	//结构体创建数据库表(自动迁移)
	db.AutoMigrate(&Account{})
}

func connMysql() *gorm.DB {
	drivername := "root:root@tcp(127.0.0.1:3306)/account?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(drivername), &gorm.Config{})

	if err != nil {
		fmt.Println("error connect mysql", err)
	}

	return db
}

type Account struct {
	Id       int
	User     string
	Password string
	Role     string
}

db.AutoMigrate(&Account{})将以结构体字段为参照,在数据库中构建数据库表,参数为结构体实例地址。结构体有id字段时,会自动映射映射为结构体的主键,且自增不为空。创建的数据表会将首字母的大写改为小写,若是驼峰名,用下划线代替。

在这里插入图片描述
一般情况下不会使用代码创建数据库。另外使用驼峰命令时,gorm框架会自动转化为下划线的格式,如下

type StuTest struct {
	StuId   int
	StuName string
	StuAge  int
	StuSex  string
}
mysql> show tables;
+-------------------+
| Tables_in_account |
+-------------------+
| accounts          |
| stu_tests         |
| user              |
+-------------------+
mysql> describe stu_tests;
+----------+----------+------+-----+---------+-------+
| Field    | Type     | Null | Key | Default | Extra |
+----------+----------+------+-----+---------+-------+
| stu_id   | bigint   | YES  |     | NULL    |       |
| stu_name | longtext | YES  |     | NULL    |       |
| stu_age  | bigint   | YES  |     | NULL    |       |
| stu_sex  | longtext | YES  |     | NULL    |       |
+----------+----------+------+-----+---------+-------+

在创建结构体时可以使用tag标签来指定创建数据库表时的相关参数。

tag描述
column指定列名
type指定列数据类型
size 指定列大小默认值255
PRIMARY_KEY将列指定为主键
UNIQUE将列指定为唯一
DEFAULT指定列默认值
PRECISION指定列精度
NOT NULL将列指定为非 NULL
AUTO_INCREMENT指定列是否为自增类型
default默认值

格式是gorm:"column:id"gorm:"PRIMARY_KEY"

type StuTest struct {
	StuId   int `gorm:"PRIMARY_KEY"`
	StuName string `gorm:"column:name"`
	StuAge  int
	StuSex  string
}

插入结构体数据

a1 := Account{0, "xiaoxu", "123456", "manager"}
db.Create(&a1)

db.Create(&a1)方法插入数据,无需写sql语句,参数为结构体实例的地址。

查询数据

var a Account
db.First(&a)
fmt.Println(a)

db.First(&a)方法是查询第一个数据,Find()方法查询指定数据,第一个参数为赋值对象,第二个参数为主键。

var a1 Account
db.Find(&a1, 2)
//db.First(&a1)
fmt.Println(a1)

where查询

// Get first matched record
db.Where("name = ?", "jinzhu").First(&user)
// SELECT * FROM users WHERE name = 'jinzhu' ORDER BY id LIMIT 1;


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

// LIKE
db.Where("name LIKE ?", "%jin%").Find(&users)
// SELECT * FROM users WHERE name LIKE '%jin%';

// AND
db.Where("name = ? AND age >= ?", "jinzhu", "22").Find(&users)
// SELECT * FROM users WHERE name = 'jinzhu' AND age >= 22;

// Time
db.Where("updated_at > ?", lastWeek).Find(&users)
// SELECT * FROM users WHERE updated_at > '2000-01-01 00:00:00';

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

更新数据

var a Account
db.First(&a)
db.Model(&a).Update("role", "admin")

更新数据首先要查出数据,对某条的某一列数据更新。除了这样查出对应数据再更改外gorm也支持指定条件更新。

更新单个列

// Update with conditions
db.Model(&User{}).Where("active = ?", true).Update("name", "hello")
// UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE active=true;

更新部分字段

// Select with Struct (select zero value fields)
db.Model(&user).Select("Name", "Age").Updates(User{Name: "new_name", Age: 0})
// UPDATE users SET name='new_name', age=0 WHERE id=111;

字段的查询用结构体的成员而不是数据的生成字段。

删除数据

var a Account
db.First(&a)
db.Delete(&a)
db.Delete(&User{}, 10)
// DELETE FROM users WHERE id = 10;

db.Delete(&User{}, "10")
// DELETE FROM users WHERE id = 10;

db.Delete(&users, []int{1,2,3})
// DELETE FROM users WHERE id IN (1,2,3);

更多请移步官网GORM 指南

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

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

相关文章

HTTP中的Content-type详解

Content-Type Content-Type(MediaType),即是Internet Media Type,互联网媒体类型,也叫做MIME类型。在互联网中有成百上千中不同的数据类型,HTTP在传输数据对象时会为他们打上称为MIME的数据格式标签&#x…

关于java.io的学习记录(写入文本)

可以通过字节流(FileOutputStream)、字符流(OutputStreamWriter)、字符缓冲流(BufferedWriter)读取文本中的数据。 FileOutputStream写入文本 public void write(){String path "writeTest.txt"…

【是C++,不是C艹】 什么是C++ | C++从哪来 | 学习建议

💞💞欢迎来到 Claffic 的博客 💞💞 👉专栏:《是C,不是C艹》👈 前言: 我知道你急着学C,但你先别急,薛之谦认识认识C还是很有必要的。本期跟大家聊…

文件夹改名,如何在改名之后批量复制文件夹名称

在日常时候中会遇到给文件夹改名的时候,那么我们又如何在改名之后批量复制文件夹名称?今天就由小编来给大家分享一下操作办法。 首先第一步,我们要进入文件批量改名高手,并在板块栏里选择“文件夹批量改名”板块。 第二步&#xf…

SpringBoot 接入chatGPT API

SpringBoot 接入chatGPT API 一、准备工作二、补全接口示例三、申请API-KEY**四、JavaScript调用API**五、SpringBoot整合ChatGPT六、使用curl模拟请求ChatGPT平台已经为技术提供了一个入口了,作为一个Java程序员,我们第一时间想到的就是快速开发一个应用,接入ChatGPT的接口…

第十四天本地锁、Redis分布锁、Redisson锁三者的区别

一、为什么要有redis分布式锁,它解决了什么问题? 在传统单体架构的项目下,使用本地锁synchronized和lock锁就可以锁住当前进程,保证线程的安全性,但是本地锁解决不了分布式环境下多个服务资源共享的问题,而…

产品研发流程管理

先看一张图,该图适应绝大部分的产品的 研发流程 (需要的可以去下 产品研发流程| ProcessOn免费在线作图,在线流程图,在线思维导图) 该图详细描述了,不同阶段应该做什么,具体的来说,是确定了什么时候 “开会…

高精度人员定位系统源码,采用vue+spring boot框架,支持二次开发

智慧工厂人员定位系统源码,高精度人员定位系统源码,UWB定位技术 文末获取联系! 在工厂日常生产活动中,企业很难精准地掌握访客和承包商等各类人员的实际位置,且无法实时监控巡检人员的巡检路线,当厂区发生灾…

【Python】实战:生成无关联单选问卷 csv《精神状态评估表》

目录 一、适用场景 二、业务需求 三、Python 文件 (1)创建文件 (2)代码示例 四、csv 文件 一、适用场景 实战场景: 问卷全部为单选题问卷问题全部为必填问题之间无关联关系每个问题的答案分数不同根据问卷全部问…

使用pandas和seaborn绘图

使用pandas和seaborn绘图 matplotlib实际上是一种比较低级的工具。要绘制一张图表,你组装一些基本组件就行:数据展示 (即图表类型:线型图、柱状图、盒形图、散布图、等值线图等)、图例、标题、刻度标签以及其他注解型…

【远程开发】VSCode使用Remote SSH远程连接Linux服务器

文章目录 前言视频教程1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 转发自CSD…

【Unity】创建一个自己的可交互AR安卓程序

目录 1 创建一个AR场景2 配置AR Camera为前置摄像头3 配置打包场景4 下载官方提供的InteractiveFaceFilterAssets资源5 配置AR Face Manager6 创建眼镜预制件7 设置AR面部追踪8 测试效果8.1 在Unity中测试8.2 在安卓设备上测试 9 在该AR场景的基础上添加自己的想法9.1 改变眼镜…

【Java|golang】1042. 不邻接植花---邻接表着色

有 n 个花园,按从 1 到 n 标记。另有数组 paths ,其中 paths[i] [xi, yi] 描述了花园 xi 到花园 yi 的双向路径。在每个花园中,你打算种下四种花之一。 另外,所有花园 最多 有 3 条路径可以进入或离开. 你需要为每个花园选择一…

C++用户信息管理服务 Thrift框架 Mysql数据落地 Redis数据缓存 Kafka 消息队列 总结 附主要源码

不知不觉入职已经一个月了,近期提交了考核2,要求如下: 1、编写一个管理用户信息的服务,通过thrift的远程过程调用实现用户信息管理功能 2、用户信息至少包括 唯一ID、用户名、性别、年龄、手机号、邮箱地址、个人描述 3、提供创建…

PHP+Vue+java导师学生双选系统设计与实现springnboot+pyton

为了直观显示系统的功能,运用用例图这样的工具显示分析的结果。分析的管理员功能如下。管理员管理学员,导师,管理项目信息,管理项目提交,管理指导项目信息。运行环境:phpstudy/wamp/xammp等 卓越导师双选系统根据调研&…

GCC 常用命令

GCC 编译过程 一个 C/C文件要经过预处理(preprocessing)、编译(compilation)、汇编(assembly)和链接(linking) 等 4 步才能变成可执行文件 (1) 预处理 C/C源文件中,以“#”开头的命令被称为预处理命令,如包含命令“#include”、…

系统集成项目管理工程师案例分析考点汇总(沟通/干系人、风险、合同等)

沟通及干系人管理常见考点1. 沟通管理计划的内容2. 项目绩效报告的主要内容3. 沟通中容易出现的问题4. 如何采取有效措施改进沟通5. 如何召开有效的会议 合同管理常见考点1. 合同签订时应注意的内容及条款2. 合同管理常见的问题3. 合同管理问题的应对措施 采购管理常见考点1. 采…

IntelliJ 上 Azure Event Hubs 全新支持来了!

大家好,欢迎来到 Java on Azure Tooling 的3月更新。在这次更新中,我们将介绍 Azure Event Hubs 支持、Azure Functions 的模板增强,以及在 IntelliJ IDEA 中部署 Azure Spring Apps 时的日志流改进。要使用这些新功能,请下载并安…

使用docker搭建Milvus向量数据库

Milvus向量数据库是什么? 官网是这样说的: Milvus创建于2019年,目标单一:存储、索引和管理由深度神经网络和其他机器学习(ML)模型生成的大量嵌入向量。 作为一个专门用于处理输入向量查询的数据库&#…

操作系统原理 —— 什么是系统调用?(五)

什么是系统调用? 有什么用作用? 我们想想怎么是系统调用呢? 系统调用 是操作系统提供给应用程序(程序员)使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序可以发出系统调用请求来获得操作系统的服务。…