当前位置: 首页 > news >正文

GO数据库操作

Golang 出色的 ORM 库为 GORM。

官网文档:https://gorm.io/docs/

我们来说说增删改查的用法,更深入的研究可以去官网看看。

GORM功能概览:

  • 关联(有一个、有多个、属于、多对多、多态性、单表继承)
  • 挂钩(创建/保存/更新/删除/查找之前/之后)
  • 急切加载Preload,Joins
  • 事务、嵌套事务、保存点、RollbackTo 到保存点
  • 上下文、准备语句模式、DryRun 模式
  • 批量插入、FindInBatches、使用 Map 查找/创建、使用 SQL Expr 和 Context Valuer 进行 CRUD
  • SQL 生成器、更新插入、锁定、优化器/索引/注释提示、命名参数、子查询
  • 复合主键、索引、约束
  • 自动迁移
  • 记录器
  • 可扩展、灵活的插件 API:Database Resolver(多个数据库、读/写拆分)/Prometheus...

  下载依赖

go -u gorm.io/gorm

表Model定义

GORM内置了一个gorm.Model结构体,gorm.Model包含了ID, CreatedAt, UpdatedAt, DeletedAt四个字段。默认情况下,GORM 使用 ID 作为主键,使用结构体名的 蛇形复数 作为表名,字段名的 蛇形 作为列名,并使用 CreatedAt、UpdatedAt 字段追踪创建、更新时间。如果表中定义了这种字段,GORM 在创建、更新和删除时会自动填充当前时间。

当然也可以不用gorm.Model,完全自定义创建、更新时间及其格式,这就需要在创建和更新时自己赋值并入库。

// 定义product表,使用gorm.Model结构体
type Product struct {gorm.ModelCode  stringPrice uint
}// 指定product表名
func (Product) TableName() string {return "product"
}

连接数据库

var db *gorm.DB// 连接数据库
func ConnDB() {var (Username = "root"Password = "123456"Endpoint = "localhost:3306"Database = "aiee"err      error)dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8&parseTime=true&loc=Local",Username, Password, Endpoint, Database,)db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})if err != nil {fmt.Println("failed to connect database,", err.Error())return}// debug模式db = db.Debug()
}

数据插入

// 数据插入
func CreateProduct() error {var (product  = Product{Code: "D42", Price: 100}products = []Product{{Code: "D43", Price: 120},{Code: "D45", Price: 150},}err error)// 数据插入一条// 实际执行sql: INSERT INTO `product` (`created_at`,`updated_at`,`deleted_at`,`code`,`price`) VALUES ('2023-12-21 11:42:10.798','2023-12-21 11:42:10.798',NULL,'D42',100)err = db.Create(&product).Errorif err != nil {fmt.Println("failed to create data,", err.Error())return err}// 插入多条// 实际执行sql: INSERT INTO `product` (`created_at`,`updated_at`,`deleted_at`,`code`,`price`) VALUES ('2023-12-21 11:42:10.8','2023-12-21 11:42:10.8',NULL,'D43',120),('2023-12-21 11:42:10.8','2023-12-21 11:42:10.8',NULL,'D45',150)err = db.Create(&products).Errorif err != nil {fmt.Println("failed to create data,", err.Error())return err}return err
}

数据读取

// 数据读取
func ReadProduct() error {var (productById   ProductproductByCode Productproducts      []Producterr           error)// 通过主键ID查询一条// 实际执行sql: SELECT * FROM `product` WHERE `product`.`id` = 1 AND `product`.`deleted_at` IS NULL ORDER BY `product`.`id` LIMIT 1err = db.First(&productById, 1).Errorif err != nil {fmt.Println("failed to read first data by id,", err.Error())return err}fmt.Println(productById)// 通过code字段读取一条// 实际执行sql: SELECT * FROM `product` WHERE code = 'D42' AND `product`.`deleted_at` IS NULL ORDER BY `product`.`id` LIMIT 1err = db.First(&productByCode, "code = ?", "D42").Errorif err != nil {fmt.Println("failed to read first data by code,", err.Error())return err}fmt.Println(productByCode)// 读取列表// 实际执行sql: SELECT * FROM `product` WHERE `product`.`deleted_at` IS NULL LIMIT 10err = db.Limit(10).Find(&products).Errorif err != nil {fmt.Println("failed to read products,", err.Error())return err}fmt.Println(products)// Where条件查询// 实际执行sql: SELECT * FROM `product` WHERE code = 'D42' AND `product`.`deleted_at` IS NULL LIMIT 10err = db.Where("code = ?", "D42").Limit(10).Find(&products).Errorif err != nil {fmt.Println("failed to read products,", err.Error())return err}fmt.Println(products)return err
}

数据更新

// 更新数据
func UpdateProduct() error {var (product Producterr     error)// 通过主键ID查询一条err = db.First(&product, 1).Errorif err != nil {fmt.Println("failed to read first data by id,", err.Error())return err}// 更新查询的数据,Price=200// 实际执行sql: UPDATE `product` SET `price`=200,`updated_at`='2023-12-21 11:57:51.842' WHERE `product`.`deleted_at` IS NULL AND `id` = 1err = db.Model(&product).Update("price", 200).Errorif err != nil {fmt.Println("failed to update product,", err.Error())return err}// 更新查询的数据,使用Product更新多字段// 实际执行sql: UPDATE `product` SET `updated_at`='2023-12-21 11:57:51.845',`code`='F41',`price`=200 WHERE `product`.`deleted_at` IS NULL AND `id` = 1err = db.Model(&product).Updates(Product{Price: 200, Code: "F41"}).Errorif err != nil {fmt.Println("failed to update product,", err.Error())return err}// 更新查询的数据,使用map更新多字段// 实际执行sql: UPDATE `product` SET `code`='F42',`price`=200,`updated_at`='2023-12-21 11:57:51.847' WHERE `product`.`deleted_at` IS NULL AND `id` = 1err = db.Model(&product).Updates(map[string]interface{}{"price": 200, "code": "F42"}).Errorif err != nil {fmt.Println("failed to update product,", err.Error())return err}// Where条件更新数据// 实际执行sql: UPDATE `product` SET `code`='F42',`price`=200,`updated_at`='2023-12-21 11:57:51.848' WHERE code = 'D42' AND `product`.`deleted_at` IS NULLerr = db.Model(&Product{}).Where("code = ?", "D42").Updates(map[string]interface{}{"price": 200, "code": "F42"}).Errorif err != nil {fmt.Println("failed to update product,", err.Error())return err}return err
}

数据删除

func DeleteProduct() error {var (product Producterr     error)// 通过ID删除数据// 实际执行sql: UPDATE `product` SET `deleted_at`='2023-12-21 12:01:41.257' WHERE `product`.`id` = 1 AND `product`.`deleted_at` IS NULLerr = db.Delete(&product, 1).Errorif err != nil {fmt.Println("failed to delete first data by id,", err.Error())return err}// 通过code删除数据// 实际执行sql: UPDATE `product` SET `deleted_at`='2023-12-21 12:03:06.449' WHERE code = 'D42' AND `product`.`deleted_at` IS NULLerr = db.Delete(&product, "code = ?", "D42").Errorif err != nil {fmt.Println("failed to delete first data by id,", err.Error())return err}// 通过Where条件删除数据// 实际执行sql: UPDATE `product` SET `deleted_at`='2023-12-21 12:04:38.424' WHERE id < 2 AND `product`.`deleted_at` IS NULLerr = db.Where("id < ?", 2).Delete(&product).Errorif err != nil {fmt.Println("failed to delete first data by id,", err.Error())return err}return err
}

相关文章:

GO数据库操作

Golang 出色的 ORM 库为 GORM。 官网文档&#xff1a;https://gorm.io/docs/ 我们来说说增删改查的用法&#xff0c;更深入的研究可以去官网看看。 GORM功能概览&#xff1a; 关联&#xff08;有一个、有多个、属于、多对多、多态性、单表继承&#xff09;挂钩&#xff08;创…...

PyTorch简单理解ChannelShuffle与数据并行技术解析

目录 torch.nn子模块详解 nn.ChannelShuffle 用法与用途 使用技巧 注意事项 参数 示例代码 nn.DataParallel 用法与用途 使用技巧 注意事项 参数 示例 nn.parallel.DistributedDataParallel 用法与用途 使用技巧 注意事项 参数 示例 总结 torch.nn子模块详…...

MySQL 8查询语句之查询所有字段、特定字段、去除重复字段、Where判断条件

《MySQL 8创建数据库、数据表、插入数据并且查询数据》里边有我使用到的数据。 再使用下方的语句补充一些数据&#xff1a; insert into Bookbought.bookuser(id,username,userphone,userage,sex,userpassword) values (11,Book Break,22245678911,18,male,good#111); insert…...

LLaMA-Factory添加adalora

感谢https://github.com/tsingcoo/LLaMA-Efficient-Tuning/commit/f3a532f56b4aa7d4200f24d93fade4b2c9042736和https://github.com/huggingface/peft/issues/432的帮助。 在LLaMA-Factory中添加adalora 1. 修改src/llmtuner/hparams/finetuning_args.py代码 在FinetuningArg…...

多端多用户万能DIY商城系统源码:自营+多商户入驻商城系统 独立部署 带完整的安装代码包以及搭建教程

电子商务行业日新月异&#xff0c;许多企业希望能够通过线上商城拓展业务。但是&#xff0c;传统商城系统往往无法满足多样化、个性化的需求&#xff0c;而且开发周期长、成本高。罗峰就来给大家分享一款多端多用户万能DIY商城系统源码&#xff0c;搭建简单。 以下是部分代码示…...

Qt 6之七:学习资源

Qt 6之七&#xff1a;学习资源 Qt是一种跨平台的C应用程序开发框架&#xff0c;它提供了一套丰富的工具和库&#xff0c;可以帮助开发者快速构建跨平台的应用程序&#xff0c;用于开发图形用户界面&#xff08;GUI&#xff09;和非GUI应用程序。 Qt 6之一&#xff1a;简介、安…...

解决大模型的幻觉问题:一种全新的视角

在人工智能领域&#xff0c;大模型已经成为了一个重要的研究方向。然而&#xff0c;随着模型规模的不断扩大&#xff0c;一种新的问题开始浮出水面&#xff0c;那就是“幻觉”问题。这种问题的出现&#xff0c;不仅影响了模型的性能&#xff0c;也对人工智能的发展带来了新的挑…...

mysql进阶-重构表

目录 1. 原因 2. 如何重构表呢&#xff1f; 2.1 命令1&#xff1a; 2.2 命令2&#xff1a; 2.3 命令3&#xff1a; 1. 原因 正常的业务开发&#xff0c;为什么需要重构表呢&#xff1f; 原因1&#xff1a;某张表存在大量的新增和删除操作&#xff0c;导致表经历过大量的…...

Element-ui图片懒加载

核心代码 <el-image src"https://img-blog.csdnimg.cn/direct/2236deb5c315474884599d90a85d761d.png" alt"我是图片" lazy><img slot"error" src"https://img-blog.csdnimg.cn/direct/81bf096a0dff4e5fa58e5f43fd44dcc6.png&quo…...

Linux系统——DNS解析详解

目录 一、DNS域名解析 1.DNS的作用 2.域名的组成 2.1域名层级结构关系特点 2.2域名空间构成 2.3域名的四种不同类型 2.3.1延伸 2.3.2总结 3.DNS域名解析过程 3.1递归查询 3.2迭代查询 3.3一次DNS解析的过程 4.DNS系统类型 4.1缓存域名服务器 4.2主域名服务器 4…...

初识Ubuntu

其实还是linux操作系统 命令都一样 但是在学习初级阶段&#xff0c;我还是将其分开有便于我的学习和稳固。 cat 查看文件 命令 Ubuntu工作中经常是用普通用户&#xff0c;在需要时才进行登录管理员用户 sudn -i 切换成管理用户 我们远程连接时 如果出现 hostname -I没有出现…...

Casper Network (CSPR)2024 年愿景:通过投资促进增长

Casper Network (CSPR&#xff09;是行业领先的 Layer-1 区块链网络之一&#xff0c;通过推出了一系列值得关注的技术改进和倡议&#xff0c;已经为 2024 年做好了准备。 在过去的一年里&#xff0c;Casper Network (CSPR&#xff09;不断取得里程碑式的进展&#xff0c;例如推…...

《MySQL系列-InnoDB引擎06》MySQL锁介绍

文章目录 第六章 锁1 什么是锁2 lock与latch3 InnoDB存储引擎中的锁3.1 锁的类型3.2 一致性非锁定读3.3 一致性锁定读3.4 自增长与锁3.5 外键和锁 4 锁的算法4.1 行锁的三种算法4.2 解决Phantom Problem 5 锁问题5.1 脏读5.2 不可重复读5.3 丢失更新 6 阻塞7 死锁 第六章 锁 开…...

获取多个PDF文件的内容并保存到excel上

# shuang # 开发时间&#xff1a;2023/12/9 22:03import pdfplumber import re import os import pandas as pd import datetimedef re_text(bt, text):# re 搜索正则匹配 包含re.compile包含的文字内容m1 re.search(bt, text)if m1 is not None:return re_block(m1[0])return…...

深入了解网络流量清洗--使用免费的雷池社区版进行防护

​ 随着网络攻击日益复杂&#xff0c;企业面临的网络安全挑战也在不断增加。在这个背景下&#xff0c;网络流量清洗成为了确保企业网络安全的关键技术。本文将探讨雷池社区版如何通过网络流量清洗技术&#xff0c;帮助企业有效应对网络威胁。 ![] 网络流量清洗的重要性&#x…...

【FFMPEG应用篇】基于FFmpeg的转码应用(FLV MP4)

方法声明 extern "C" //ffmpeg使用c语言实现的&#xff0c;引入用c写的代码就要用extern { #include <libavcodec/avcodec.h> //注册 #include <libavdevice/avdevice.h> //设备 #include <libavformat/avformat.h> #include <libavutil/…...

LInux初学之路linux的磁盘分区/远程控制/以及关闭图形界面/查看个人身份

虚拟机磁盘分配 hostname -I 查看ip地址 ssh root虚拟就ip 远程连接 win10之后才有 远程控制重新启动 reboot xshell 使用&#xff08;个人和家庭版 免费去官方下载&#xff09; init 3 关闭界面 减小内存使用空间 init 5 回复图形界面 runlevel显示的是状态 此时和上…...

Netty 介绍、使用场景及案例

Netty 介绍、使用场景及案例 1、Netty 介绍 https://github.com/netty/netty Netty是一个高性能、异步事件驱动的网络应用程序框架&#xff0c;用于快速开发可扩展的网络服务器和客户端。它是一个开源项目&#xff0c;最初由JBoss公司开发&#xff0c;现在由社区维护。Netty的…...

小游戏选型(一):游戏化设计助力直播间互动和营收

一、社交直播间小游戏火爆 大家好&#xff0c;作为一个技术宅和游戏迷&#xff0c;今天来聊聊近期爆火的社交直播间小游戏的潮流。喜欢冲浪玩社交产品的小伙伴会发现&#xff0c;近期各大平台都推出了直播间社交小游戏&#xff0c;直播间氛围火爆&#xff0c;小游戏玩法简单&a…...

社区嵌入式服务设施建设为社区居家养老服务供给增加赋能

近年来&#xff0c;沈阳市浑南区委、区政府牢记在辽宁考察时的重要指示精神&#xff0c;认真践行以人民为中心的发展思想&#xff0c;聚集“一老一小”民生关切&#xff0c;统筹推进以社区为骨干结点的养老服务探索实践。围绕“品质养老”民生服务理念&#xff0c;针对社区老年…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...

CMS内容管理系统的设计与实现:多站点模式的实现

在一套内容管理系统中&#xff0c;其实有很多站点&#xff0c;比如企业门户网站&#xff0c;产品手册&#xff0c;知识帮助手册等&#xff0c;因此会需要多个站点&#xff0c;甚至PC、mobile、ipad各有一个站点。 每个站点关联的有站点所在目录及所属的域名。 一、站点表设计…...

vxe-table vue 表格复选框多选数据,实现快捷键 Shift 批量选择功能

vxe-table vue 表格复选框多选数据&#xff0c;实现快捷键 Shift 批量选择功能 查看官网&#xff1a;https://vxetable.cn 效果 代码 通过 checkbox-config.isShift 启用批量选中,启用后按住快捷键和鼠标批量选取 <template><div><vxe-grid v-bind"gri…...

篇章一 论坛系统——前置知识

目录 1.软件开发 1.1 软件的生命周期 1.2 面向对象 1.3 CS、BS架构 1.CS架构​编辑 2.BS架构 1.4 软件需求 1.需求分类 2.需求获取 1.5 需求分析 1. 工作内容 1.6 面向对象分析 1.OOA的任务 2.统一建模语言UML 3. 用例模型 3.1 用例图的元素 3.2 建立用例模型 …...

OpenHarmony标准系统-HDF框架之I2C驱动开发

文章目录 引言I2C基础知识概念和特性协议&#xff0c;四种信号组合 I2C调试手段硬件软件 HDF框架下的I2C设备驱动案例描述驱动Dispatch驱动读写 总结 引言 I2C基础知识 概念和特性 集成电路总线&#xff0c;由串网12C(1C、12C、Inter-Integrated Circuit BUS)行数据线SDA和串…...