golang操作mysql基础驱动github.com/go-sql-driver/mysql使用

ops/2024/11/20 21:20:02/

golang中类似java操作sql>mysql的jdbc一样,github.com/go-sql-driver/sql>mysql也为go提供了基础接口,在开发中往往需要写更多的代码来满足自己的定制需求,java在驱动基础上有了扩展,orm框架诞生,mybatis、jpa等都是好用的扩展框架,go也不例外除了知道基础框架的实现和使用外,其他的orm框架也要轻松上手知道他们怎么在基础之上实现的,是否自己实现一套框架,go中的sql>mysql框架比较多,这意味着基础框架github.com/go-sql-driver/sql>mysql做的相当优秀,上层可以i灵活且自由的实现,我们这次主要是复习基础驱动的使用,如下:

package mainimport ("database/sql""fmt""log""time"_ "github.com/go-sql-driver/sql>mysql"
)//  用户表结构体
type User struct {id       int64  `db:"id"`name     string `db:"name"`password string `db:"password"`age      int    `db:"age"`
}var MysqlDb *sql.DB
var MysqlDbErr errorconst (USER_NAME = "root"PASS_WORD = "fbw123"HOST      = "localhost"PORT      = "3307"DATABASE  = "node"CHARSET   = "utf8"
)func linksql() {dbDSN := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s", USER_NAME, PASS_WORD, HOST, PORT, DATABASE, CHARSET)// 打开连接失败MysqlDb, MysqlDbErr = sql.Open("sql>mysql", dbDSN)//defer MysqlDb.Close();if MysqlDbErr != nil {log.Println("dbDSN: " + dbDSN)panic("数据源配置不正确: " + MysqlDbErr.Error())}// 最大连接数MysqlDb.SetMaxOpenConns(100)// 闲置连接数MysqlDb.SetMaxIdleConns(20)// 最大连接周期MysqlDb.SetConnMaxLifetime(100 * time.Second)if MysqlDbErr = MysqlDb.Ping(); nil != MysqlDbErr {panic("数据库链接失败: " + MysqlDbErr.Error())} else {fmt.Println("数据库连接成功")}
}// 查询数据,指定字段名---完成
func StructQueryField(id int64) {user := new(User)row := MysqlDb.QueryRow("select id, name, age,password from user where id=?", id)if err := row.Scan(&user.id, &user.name, &user.age, &user.password); err != nil {fmt.Printf("scan failed, err:%v", err)fmt.Println("查询失败")return}fmt.Println(user.id, user.name, user.age, user.password)
}// 查询数据,取所有字段-----完成
func StructQueryAllField() {// 通过切片存储users := make([]User, 0)//分页查询一次查询2个记录rows, _ := MysqlDb.Query("SELECT * FROM `user` limit ?", 2)// 遍历var user Userfor rows.Next() {rows.Scan(&user.id, &user.name, &user.age, &user.password)users = append(users, user)}fmt.Println(users)}// 插入数据-----完成
func StructInsert(id int, name string, age int8, password string) {ret, _ := MysqlDb.Exec("insert INTO user(id,name,age,password) values(?,?,?,?)", id, name, age, password)//插入数据的主键idlastInsertID, _ := ret.LastInsertId()fmt.Println("LastInsertID:", lastInsertID)//影响行数rowsaffected, _ := ret.RowsAffected()fmt.Println("RowsAffected:", rowsaffected)}// 更新数据 -------完成
func StructUpdate(id int64, name string, password string, age int8) {ret, _ := MysqlDb.Exec("UPDATE user set name=?,password=?,age=? where id=?", name, password, age, id)upd_nums, _ := ret.RowsAffected()fmt.Println("RowsAffected:", upd_nums)
}// 删除数据------完成
func StructDeluserByid(id uint64) {ret, _ := MysqlDb.Exec("delete from user where id=?", id)del_nums, _ := ret.RowsAffected()fmt.Println("RowsAffected:", del_nums)
}// 事务处理,结合预处理----完成
func StructTx() {//事务处理,前面的插入代码没有什么问题,在后面的条件不满足下事务回滚tx, _ := MysqlDb.Begin()// 新增userAddPre, _ := MysqlDb.Prepare("insert into user(name,password,age) values(?, ?,?)")addRet, _ := userAddPre.Exec("zhaoliu", "mima", 12)ins_nums, _ := addRet.RowsAffected()// 更新userUpdatePre1, _ := tx.Exec("update user set name = 'zhansan'  where name=?", "张三")upd_nums1, _ := userUpdatePre1.RowsAffected()userUpdatePre2, _ := tx.Exec("update user set name = 'lisi'  where name=?", "李四")upd_nums2, _ := userUpdatePre2.RowsAffected()fmt.Println(ins_nums)fmt.Println(upd_nums1)fmt.Println(upd_nums2)if ins_nums > 0 && upd_nums1 > 0 && upd_nums2 > 0 {tx.Commit()} else {tx.Rollback()}}// 查询数据,指定字段名,不采用结构体 ------完成
func RawQueryField() {rows, _ := MysqlDb.Query("select id,name from user")if rows == nil {return}id := 0name := ""fmt.Println(rows)for rows.Next() {rows.Scan(&id, &name)fmt.Println(id, name)}
}// 查询数据,取所有字段,不采用结构体------完成
func RawQueryAllField() {//查询数据,取所有字段rows2, _ := MysqlDb.Query("select * from user")//返回所有列cols, _ := rows2.Columns()//这里表示一行所有列的值,用[]byte表示vals := make([][]byte, len(cols))//这里表示一行填充数据scans := make([]interface{}, len(cols))//这里scans引用vals,把数据填充到[]byte里for k, _ := range vals {scans[k] = &vals[k]}i := 0result := make(map[int]map[string]string)for rows2.Next() {//填充数据rows2.Scan(scans...)//每行数据row := make(map[string]string)//把vals中的数据复制到row中for k, v := range vals {key := cols[k]//这里把[]byte数据转成stringrow[key] = string(v)}//放入结果集result[i] = rowi++}fmt.Println(result)for k, v := range result {fmt.Println(k, v)//每条属性打一遍for k, p := range v {fmt.Println(k, p)}}
}func main() {linksql()// StructQueryField(2020110131)// StructInsert(100,"lv"",23 "wenli")// StructQueryAllField()// StructUpdate(100,"少年","wjr",20)// StructDeluserByid(100)// StructTx()//查询所有的数据显示指定字段// RawQueryField()RawQueryAllField()
}


http://www.ppmy.cn/ops/135324.html

相关文章

基于Vue+SpringBoot的求职招聘平台

平台概述 本平台是一个高效、便捷的人才与职位匹配系统,旨在为求职者与招聘者提供一站式服务。平台内设三大核心角色:求职者、招聘者以及超级管理员,每个角色拥有独特的功能模块,确保用户能够轻松完成从信息获取到最终录用的整个…

Linux进阶:软件安装、网络操作、端口、进程等

软件安装 yum 和 apt 均需要root权限 CentOS系统使用: yum [install remove search] [-y] 软件名称 install 安装remove 卸载search 搜索-y,自动确认 Ubuntu系统使用 apt [install remove search] [-y] 软件名称 install 安装remove 卸载search 搜索-y&…

2024山西省网络建设运维第十八届职业院校技能大赛解析答案(5. nginx 和 tomcat 服务)

\5. nginx 和 tomcat 服务 任务描述:利用系统自带tomcat,搭建 Tomcat网站。 (1)配置 linux2 为 nginx 服务器,默认文档 index.html 的内容为 “HelloNginx”;仅允许使用域名访问,http 访问自动跳转到 https。 (2)利用 nginx 反向代理,实现 linux3 和 linux4 的 tomca…

CH06_Lambda表达式

第6章:Lambda表达式 本章目标 为什么要学习C#编程语言 了解C#相关常识 C#开发工具Visual Studio安装 掌握C#程序的开发步骤 掌握C#的注释 掌握C#的常用转义符 本章内容 lambda表达式演变史 C# 匿名函数的演变历史可以追溯到 C# 语言的不同版本,…

django从入门到实战(四)——模型与数据库

1. 模型的定义与数据迁移 1.1 模型的定义 在 Django 中,模型是一个 Python 类,用于定义数据库中的数据结构。每个模型类对应数据库中的一张表,类的属性对应表中的字段。 示例: from django.db import modelsclass Blog(models…

Pytest-Bdd-Playwright 系列教程(11):场景快捷方式

Pytest-Bdd-Playwright 系列教程(11):场景快捷方式 前言1. 手动绑定场景的传统方法2. 场景快捷方式的自动绑定方法2.1 绑定所有场景2.2 绑定多个路径2.3 自动与手动绑定的结合 3. 示例:结合 Playwright 的实际应用3.1 项目目录结构…

信息安全工程师(83)Windows操作系统安全分析与防护

一、Windows操作系统安全分析 系统漏洞: Windows操作系统由于其复杂性和广泛使用,可能存在一些已知或未知的漏洞。这些漏洞可能会被黑客利用,进行恶意攻击。微软会定期发布系统更新和补丁,以修复这些漏洞,提高系统的安…

Efficient One-stage Video Object Detection byExploiting Temporal Consistency

【摘要】 近年来,与传统的两级检测器相比,一级检测器在图像数据处理上取得了具有竞争力的精度和更快的速度。然而,在视频目标检测领域,大多数现有的视频目标检测方法仍然是基于两级检测器。此外,直接将现有的VOD方法应…