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从入门到精通 ✨特色专栏…...

切分支解决切不走因为未合并的路径如何解决
改代码的时候改做分支了,本来是在另一个分支上面改代码,结果改到另一个放置上面,然后想着使用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.单调递增的数字 题目链接🔥🔥 给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。 (当且仅当每个相邻位数上的…...

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

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

图神经网络教程之GCN(pyG)
图神经网络-pyG版本的GCN Data(数据) 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用来进行逻辑判断的运算符,虽然运算符只有and、or、not三种,但是理解这三个运算符的原理才是最重要的 python中对false的认定 逻辑运算符是python用来进行逻辑判断的运算符,虽然运算符只有and、or、not三种&…...

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

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

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

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

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

sql:SQL优化知识点记录(十一)
(1)用Show Profile进行sql分析 新的一个优化的方式show Profile 运行一些查询sql: 查看一下我们执行过的sql 显示sql查询声明周期完整的过程: 当执行过程出现了下面这4个中的时,就会有问题导致效率慢 8这个sql创建…...

leetcode-链表类题目
文章目录 链表(Linked List) 链表(Linked List) 定义:链表(Linked List)是一种线性表数据结构,他用一组任意的存储单元来存储数据,同时存储当前数据元素的直接后继元素所…...

数据结构——哈希
哈希表 是一种使用哈希函数组织数据的数据结构,它支持快速插入和搜索。 哈希表(又称散列表)的原理为:借助 哈希函数,将键映射到存储桶地址。更确切地说, 1.首先开辟一定长度的,具有连续物理地址…...

效果好的it监控系统特点
一个好的IT监控系统应该具备以下特点: 全面性:IT监控系统应该能够监视和管理IT系统的所有方面,包括网络、服务器、应用程序和数据库等。这样可以确保系统的各个方面都得到充分的监视和管理。 可靠性:IT监控系统需要保持高可…...

leetcode1288. 删除被覆盖区间(java)
删除被覆盖区间 题目描述贪心法代码演示 题目描述 难度 - 中等 leetcode1288. 删除被覆盖区间 给你一个区间列表,请你删除列表中被其他区间所覆盖的区间。 只有当 c < a 且 b < d 时,我们才认为区间 [a,b) 被区间 [c,d) 覆盖。 在完成所有删除操作…...

Python 虚拟环境相关命令
一 激活 在 cd venv/scripts 进入虚拟环境 执行命令 activate 1、创建虚拟环境 $ python -m venv 2、激活虚拟环境 $ source <venv>/bin/activate 3、关闭虚拟环境 $ deactivate...

使用U盘同步WSL2中的git项目
1、将U盘挂载到WSL2中 假设U盘在windows资源管理器中被识别为F盘,需要在WSL2中创建一个目录挂载U盘 sudo mkdir /mnt/f sudo mount -t drvfs F: /mnt/f后续所有的操作都完成后,拔掉U盘前,可以使用下面的命令从WSL2中安全的移除U盘 umount …...

Stable Diffuse AI 绘画 之 ControlNet 插件及其对应模型的下载安装
Stable Diffuse AI 绘画 之 ControlNet 插件及其对应模型的下载安装 目录 Stable Diffuse AI 绘画 之 ControlNet 插件及其对应模型的下载安装 一、简单介绍 二、ControlNet 插件下载安装 三、ControlNet 插件模型下载安装 四、ControlNet 插件其他的下载安装方式 五、Co…...

CMAK学习
VS中的cmake_cmake vs_今天也要debug的博客-CSDN博客 利用vs2017 CMake开发跨平台C项目实战_cmake vs2017_神气爱哥的博客-CSDN博客 【【入门】在VS中使用CMake管理若干程序】https://www.bilibili.com/video/BV1iz4y117rZ?vd_source0aeb782d0b9c2e6b0e0cdea3e2121eba...

Python 推导式
Python 推导式 Python 推导式是一种独特的数据处理方式,可以从一个数据序列构建另一个新的数据序列的结构体。 Python 支持各种数据结构的推导式: 列表(list)推导式字典(dict)推导式集合(set)推导式元组(tuple)推导式 列表推导式 列表推导式格式为&…...