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

golang操作数据库--gorm框架、redis

目录

  • 1.数据库相关操作
    • (1)非orm框架
      • ①引入
      • ②初始化
      • ③增删改查
    • (2) io版orm框架 (推荐用这个)
      • ①引入
      • ②初始化
      • ③增删改查
      • ④gorm gen的使用
    • (3) jinzhu版orm框架
      • ①引入
      • ②初始化
      • ③增删改查
  • 2.redis
    • (1)引入
    • (2)初始化
      • ①普通初始化
      • ②v8初始化
      • ③get/set示例

1.数据库相关操作

(1)非orm框架

①引入

go get github.com/go-sql-driver/mysql

②初始化

import ("database/sql""fmt""github.com/Project02/utils"_ "github.com/go-sql-driver/mysql"
)func InitDB() (err error) {// DSN:Data Source Namedsn := "root:991113@tcp(127.0.0.1:3306)/chuangyitest?charset=utf8mb4&parseTime=True"// 不会校验账号密码是否正确// 注意!!!这里不要使用:=,我们是给全局变量赋值,然后在main函数中使用全局变量dbMyDB, err = sql.Open("mysql", dsn)if err != nil {fmt.Println(fmt.Sprintf("database open err, err=%s", utils.GetLogStr(err)))return}// 尝试与数据库建立连接(校验dsn是否正确)err = MyDB.Ping()if err != nil {fmt.Println(fmt.Sprintf("database ping err, err=%s", utils.GetLogStr(err)))return}fmt.Println("建立链接成功...")return
}

③增删改查

// 查询数据示例
func queryRowDemo() {sqlStr := "select * from user_tag where id > ?"rows, err := caller.MyDB.Query(sqlStr, 250)if err != nil {fmt.Printf("query failed, err:%v\n", err)return}defer rows.Close()for rows.Next() {var ut UserTagerr := rows.Scan(&ut.Id, &ut.Name, &ut.EntityId, &ut.TimeCreated)if err != nil {fmt.Printf("scan failed, err:%v\n", err)return}fmt.Printf("res=%s\n", utils.GetLogStr(ut))}
}// 插入数据
func insertRowDemo() {sqlStr := "insert into user_tag(name, entity_id, time_created) values (?,?,?)"nowTime := time.Now().Format("2006-01-02 15:04:05")ret, err := caller.MyDB.Exec(sqlStr, "王五", 2, nowTime)if err != nil {fmt.Printf("insert failed, err:%v\n", err)return}theID, err := ret.LastInsertId() // 新插入数据的idif err != nil {fmt.Printf("get lastinsert ID failed, err:%v\n", err)return}fmt.Printf("insert success, the id is %d.\n", theID)
}// 更新数据
func updateRowDemo() {sqlStr := "update user_tag set time_created=? where id = ?"nowTime := time.Now().Format("2006-01-02 15:04:05")ret, err := caller.MyDB.Exec(sqlStr, nowTime, 259)if err != nil {fmt.Printf("update failed, err:%v\n", err)return}n, err := ret.RowsAffected() // 操作影响的行数if err != nil {fmt.Printf("get RowsAffected failed, err:%v\n", err)return}fmt.Printf("update success, affected rows:%d\n", n)
}// 删除数据
func deleteRowDemo() {sqlStr := "delete from user_tag where id = ?"ret, err := caller.MyDB.Exec(sqlStr, 3)if err != nil {fmt.Printf("delete failed, err:%v\n", err)return}n, err := ret.RowsAffected() // 操作影响的行数if err != nil {fmt.Printf("get RowsAffected failed, err:%v\n", err)return}fmt.Printf("delete success, affected rows:%d\n", n)
}

(2) io版orm框架 (推荐用这个)

官网: http://gorm.io/

①引入

go get gorm.io/driver/mysql
go get gorm.io/gorm

②初始化

import ("fmt""gorm.io/driver/mysql""gorm.io/gorm"
)var (MyDB *gorm.DB
)func Init() {// 初始化数据库InitDB()
}func InitDB() {MyDB = InitDBDetail("root", "123456", "lyhtest", "127.0.0.1", 3306)fmt.Println("success...")return
}func InitDBDetail(username, password, dbname, ip string, port int64) *gorm.DB {dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", username, password, ip, port, dbname)db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})if err != nil {panic(err)}return db
}

③增删改查

说明:Debug()可以查看执行的sql语句。

// 增
func createDemo() {userTag := UserTag{Name:     "java",EntityId: 2,}caller.MyDB.Debug().Table("user_tag").Create(&userTag)// 新增的主键fmt.Println(utils.GetLogStr(userTag.Id))
}// 改
func updateDemo() {userTag := UserTag{Name: "玩耍2",}aa := caller.MyDB.Debug().Table("user_tag").Where("id=?", 259).Updates(&userTag) // 注意是Updatesfmt.Println(utils.GetLogStr(aa))
}// 查
func queryDemo() {userTagList := make([]UserTag, 0)caller.MyDB.Debug().Table("user_tag").Where("id = ?", 259).Find(&userTagList)fmt.Println(utils.GetLogStr(userTagList))
}

④gorm gen的使用

a.先安装(会安装到gopath的bin目录下,windows电脑,需要将该路径加入到系统路径)

go install gorm.io/gen/tools/gentool@latest
gentool -hUsage of gentool:-c stringconfig file path  配置文件路径-db stringinput mysql or postgres or sqlite or sqlserver. consult[https://gorm.io/docs/connecting_to_the_database.html] (default "mysql")-dsn stringconsult[https://gorm.io/docs/connecting_to_the_database.html]-fieldNullablegenerate with pointer when field is nullable-fieldWithIndexTaggenerate field with gorm index tag-fieldWithTypeTaggenerate field with gorm column type tag-modelPkgName stringgenerated model code's package name  {生成结构体的路径}-outFile stringquery code file name, default: gen.go-outPath stringspecify a directory for output (default "./dao/query")   {生成query的路径}-tables stringenter the required data table or leave it blank-onlyModelonly generate models (without query file)-withUnitTestgenerate unit test for query code-fieldSignabledetect integer field's unsigned type, adjust generated data type

eg :

--tables="orders"       # generate from `orders`--tables="orders,users" # generate from `orders` and `users`--tables=""             # generate from all tables 这样是全部的表名

b.举例:
说明1:windows电脑go install之后,把exe添加到系统路径,然后最好使用cmd运行, 先进入到项目目录,执行下面的命令(如果提示没有gcc命令,需要先安装该命令)
说明2:-modelPkgName属性是在-outPath路径的上一级目录的基础上的

gentool -dsn "root:991113@tcp(127.0.0.1:3306)/chuangyitest?charset=utf8&parseTime=True&loc=Local" -tables ""  -outPath "./dal/query" -modelPkgName "./models"

生成的项目结构为:

projectdalmodelsquery

(3) jinzhu版orm框架

官网: https://pkg.go.dev/github.com/jinzhu/gorm#Open

①引入

go get github.com/go-sql-driver/mysql
go get -u github.com/jinzhu/gorm

②初始化

package callerimport ("fmt"_ "github.com/go-sql-driver/mysql""github.com/jinzhu/gorm""liuyaohui.lyh/Project03/utils"
)var (MyDB *gorm.DB
)func Init() {// 初始化数据库if err := InitDB(); err != nil {fmt.Println(fmt.Sprintf("database err, err=%s", utils.GetLogStr(err)))}
}func InitDB() (err error) {MyDB, err = gorm.Open("mysql", "root:991113@tcp(127.0.0.1:3306)/chuangyitest?charset=utf8&parseTime=True&loc=Local")if err != nil {fmt.Println(fmt.Sprintf("database open err, err=%s", utils.GetLogStr(err)))return}fmt.Println("database success...")return
}

③增删改查

// 增
func MyInsert() {caller.MyDB.Table("user_tag").Create(&UserTag{Name: "ik01001", EntityId: 2})
}// 查
func myQuery() {var userTag UserTagcaller.MyDB.Table("user_tag").First(&userTag, "id = ?", 259) // 查询code为259的userTagfmt.Printf("%s\n", utils.GetLogStr(userTag))userTagList := make([]UserTag, 0)caller.MyDB.Table("user_tag").Find(&userTagList, "id > ?", 257)fmt.Printf("%s\n", utils.GetLogStr(userTagList))
}// 事务
func myTx() error {// 注意,一旦你在一个事务中,使用tx作为数据库句柄tx := caller.MyDB.Table("user_tag").Begin()// 注意:where一定要在更新操作前面,不然会数据全部更新// 方式1if err := tx.Where(map[string]interface{}{"id": 259}).Update(&UserTag{Name: "玩耍2"}).Error; err != nil {tx.Rollback()return err}// 方式2if err := tx.Where("id=?", 259).Update(&UserTag{Name: "玩耍333"}).Error; err != nil {tx.Rollback()return err}tx.Commit()return nil
}

2.redis

网址:https://liwenzhou.com/posts/Go/go_redis/

(1)引入

go get -u github.com/go-redis/redis

(2)初始化

①普通初始化

// 声明一个全局的rdb变量
var rdb *redis.Client// 初始化连接
func initClient() (err error) {rdb = redis.NewClient(&redis.Options{Addr:     "localhost:6379",Password: "", // no password setDB:       0,  // use default DB})_, err = rdb.Ping().Result()if err != nil {return err}return nil
}

②v8初始化

import ("context""fmt""time""github.com/go-redis/redis/v8" // 注意导入的是新版本
)var (rdb *redis.Client
)// 初始化连接
func initClient() (err error) {rdb = redis.NewClient(&redis.Options{Addr:     "localhost:16379",Password: "",  // no password setDB:       0,   // use default DBPoolSize: 100, // 连接池大小})ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)defer cancel()_, err = rdb.Ping(ctx).Result()return err
}

③get/set示例

func redisExample() {err := rdb.Set("score", 100, 0).Err()if err != nil {fmt.Printf("set score failed, err:%v\n", err)return}val, err := rdb.Get("score").Result()if err != nil {fmt.Printf("get score failed, err:%v\n", err)return}fmt.Println("score", val)val2, err := rdb.Get("name").Result()if err == redis.Nil {fmt.Println("name does not exist")} else if err != nil {fmt.Printf("get name failed, err:%v\n", err)return} else {fmt.Println("name", val2)}
}

相关文章:

golang操作数据库--gorm框架、redis

目录 1.数据库相关操作(1)非orm框架①引入②初始化③增删改查 (2) io版orm框架 (推荐用这个)①引入②初始化③增删改查④gorm gen的使用 (3) jinzhu版orm框架①引入②初始化③增删改查 2.redis(1)引入(2)初始化①普通初始化②v8初始化③get/set示例 1.数据库相关操作 (1)非orm…...

10 种常用的字符串方法

10 种常用的字符串方法 1.concat() 字符串拼接 const str1 12345678;const str2 abcdefgh;const str3 -【】;‘;console.log(str1.concat(str2,str3))//12345678abcdefgh-【】;‘ 2.includes() 判断字符串中是否包含指定值,返回布尔值…...

CSDN每日一练 |『生命进化书』『订班服』『c++难题-大数加法』2023-09-06

CSDN每日一练 |『生命进化书』『订班服』『c++难题-大数加法』2023-09-06 一、题目名称:生命进化书二、题目名称:订班服三、题目名称:c++难题-大数加法一、题目名称:生命进化书 时间限制:1000ms内存限制:256M 题目描述: 小A有一本生命进化书,以一个树形结构记载了所有生…...

echarts饼图label自定义样式

生成的options {"tooltip": {"trigger": "item","axisPointer": {"type": "shadow"},"backgroundColor": "rgba(9, 24, 48, 0.5)","borderColor": "rgba(255,255,255,0.4)&q…...

Unity汉化一个插件 制作插件汉化工具

我是编程一个菜鸟,英语又不好,有的插件非常牛!我想学一学,页面全是英文,完全不知所措,我该怎么办啊...尝试在Unity中汉化一个插件 效果: 思路: 如何在Unity中把一个自己喜欢的插件…...

从过滤器初识责任链设计模式

下面用的过滤器都是注解方式 可以使用非注解方式,就是去web.xml配置映射关系 上面程序的执行输出是 再加一个过滤器 下面来看一段程序 输出结果 和过滤器是否非常相识 但是上面这段程序存在的问题:在编译阶段已经完全确定了调用关系,如果你想改变他们的调用顺序或者继续添加一…...

Redis7安装配置

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: Java从入门到精通 ✨特色专栏&#xf…...

切分支解决切不走因为未合并的路径如何解决

改代码的时候改做分支了,本来是在另一个分支上面改代码,结果改到另一个放置上面,然后想着使用git stash进行保存,然后切到另外一个分支再pop,结果不行。 报这个错误,导致切不过去,因为我这边pop…...

自动化运维:Ansible之playbook基于ROLES部署LNMP平台

目录 一、理论 1.playbook剧本 2.ROLES角色 3.关系 4.Roles模块搭建LNMP架构 二、实验 1.Roles模块搭建LNMP架构 三、问题 1.剧本启动php报错语法问题 2.剧本启动mysql报错语法问题 3.剧本启动nginx开启失败 4.剧本安装php失败 5.使用yum时报错 6.rpm -Uvh https…...

SpringBoot整合MQ

1.创建工程并引入依赖 <!-- 添加rocketmq的启动器--><dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.1.1</version></dependency>2.编写…...

算法训练day37|贪心算法 part06(LeetCode738.单调递增的数字)

文章目录 738.单调递增的数字思路分析代码实现 738.单调递增的数字 题目链接&#x1f525;&#x1f525; 给定一个非负整数 N&#xff0c;找出小于或等于 N 的最大的整数&#xff0c;同时这个整数需要满足其各个位数上的数字是单调递增。 &#xff08;当且仅当每个相邻位数上的…...

【C++基础】4. 变量

文章目录 【 1. 变量的定义 】【 2. 变量的声明 】示例 【 3. 左值和右值 】 变量&#xff1a;相当于是程序可操作的数据存储区的名称。在 C 中&#xff0c;有多种变量类型可用于存储不同种类的数据。C 中每个变量都有指定的类型&#xff0c;类型决定了变量存储的大小和布局&am…...

jmeter setUp Thread Group

SetUp Thread Group 是一种特殊类型的线程组&#xff0c;它用于在主测试计划执行之前执行一些初始化任务。 SetUp Thread Group 通常用于以下几种情况&#xff1a; 用户登录&#xff1a;在模拟用户执行实际测试之前&#xff0c;模拟用户登录到系统以获取访问权限。 创建会话&a…...

图神经网络教程之GCN(pyG)

图神经网络-pyG版本的GCN Data&#xff08;数据&#xff09; data.x、data.edge_index、data.edge_attr、data.y、data.pos 举个例子 import torch from torch_geometric.data import Data edge_index torch.tensor([[0, 1, 1, 2],[1, 0, 2, 1]], dtypetorch.long) #代表…...

python中的逻辑运算

逻辑运算 逻辑运算符是python用来进行逻辑判断的运算符&#xff0c;虽然运算符只有and、or、not三种&#xff0c;但是理解这三个运算符的原理才是最重要的 python中对false的认定 逻辑运算符是python用来进行逻辑判断的运算符&#xff0c;虽然运算符只有and、or、not三种&…...

TortoiseGit设置作者信息和用户名、密码存储

前言 Git 客户端每次与服务器交互&#xff0c;都需要输入密码&#xff0c;但是我们可以配置保存密码&#xff0c;只需要输入一次&#xff0c;就不再需要输入密码。 操作说明 在任意文件夹下&#xff0c;空白处&#xff0c;鼠标右键点击 在弹出菜单中按照下图点击 依次点击下…...

Fragment.OnPause的事情

我们知道Fragment的生命周期依附于相应Activity的生命周期&#xff0c;如果activity A调用了onPause&#xff0c;则A里面的fragment也会相应收到onPause回调&#xff0c;这里以support27.1.1版本的源码来说明Fragment生命周期onPause的事情。 当activity执行onPause时&#xff…...

【C++基础】5. 变量作用域

文章目录 【 1. 局部变量 】【 2. 全局变量 】【 3. 局部变量和全局变量的初始化 】 作用域是程序的一个区域&#xff0c;一般来说有三个地方可以定义变量&#xff1a; 在函数或一个代码块内部声明的变量&#xff0c;称为局部变量。 在函数参数的定义中声明的变量&#xff0c;称…...

Python列表排序

介绍一个关于列表排序的sort方法&#xff0c;看下面的案例&#xff1a; """ 列表的sort方法来对列表进行自定义排序 """# 准备列表 my_list [["a", 33], ["b", 55], ["c", 11]]# 排序&#xff0c;基于带名函数 …...

(云HIS)云医院管理系统源码 SaaS模式 B/S架构 基于云计算技术

通过提供“一个中心多个医院”平台&#xff0c;为集团连锁化的医院和区域医疗提供最前沿的医疗信息化云解决方案。 一、概述 云HIS系统源码是一款满足基层医院各类业务需要的健康云产品。该系统能帮助基层医院完成日常各类业务&#xff0c;提供病患预约挂号支持、收费管理、病…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

实战三:开发网页端界面完成黑白视频转为彩色视频

​一、需求描述 设计一个简单的视频上色应用&#xff0c;用户可以通过网页界面上传黑白视频&#xff0c;系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观&#xff0c;不需要了解技术细节。 效果图 ​二、实现思路 总体思路&#xff1a; 用户通过Gradio界面上…...

Vue3 PC端 UI组件库我更推荐Naive UI

一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用&#xff0c;前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率&#xff0c;还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库&#xff08;Naive UI、Element …...