用 Go 访问 MySql 数据库

news2024/9/22 3:32:51

#pic_center =60x60

  • 所有代码样例
package main

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
)

var db *sql.DB

// 初始化连接
func initDB() (err error) {
	db, err = sql.Open("mysql", "root:mm..1213@tcp(127.0.0.1:3306)/chapter4")
	if err != nil {
		return nil
	}
	err = db.Ping()
	if err != nil {
		return err
	}
	return nil
}

type User struct {
	Uid   int
	Name  string
	Phone string
}

// 单行查询
func queryRow() {
	u := User{}
	err := db.QueryRow("select uid,name,phone from `user` where uid=?", 1).Scan(&u.Uid, &u.Name, &u.Phone)
	if err != nil {
		fmt.Printf("scan failed,err:%v\n", err)
		return
	}
	fmt.Printf("uid:%d name:%s phone:%s\n", u.Uid, u.Name, u.Phone)
}

// 多行查询
func queryMultiRow() {
	u := User{}
	rows, err := db.Query("select uid,name,phone from `user` where uid > ?", 0)
	if err != nil {
		fmt.Printf("query failed, err:%v\n", err)
		return
	}
	defer rows.Close()
	for rows.Next() {
		err := rows.Scan(&u.Uid, &u.Name, &u.Phone)
		if err != nil {
			fmt.Printf("scan failed, err:%v\n", err)
			return
		}
		fmt.Printf("uid:%d name:%s phone:%s\n", u.Uid, u.Name, u.Phone)
	}
}

// 插入操作
func insertRow() {
	ret, err := db.Exec("insert into user(name,phone) values (?,?)", "王五", 13988557744)
	if err != nil {
		fmt.Printf("insert failed,err:%v\n", err)
		return
	}
	uid, err := ret.LastInsertId()
	if err != nil {
		fmt.Printf("get lastinsert Id failed,err:%v\n", err)
		return
	}
	fmt.Printf("insert success,the id is %d.\n", uid)
}

// 更新数据
func updateRow() {
	ret, err := db.Exec("update user set name=? where uid =?", "张三", 3)
	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)
	}
	fmt.Printf("update success, affected rows:%d\n", n)
}

// 删除数据
func deleteRow() {
	ret, err := db.Exec("delete from user where uid = ?", 2)
	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)
}

// 预处理查询
func prepareQuery() {
	u := User{}
	stmt, err := db.Prepare("select uid,name,phone from `user` where uid>?")
	if err != nil {
		fmt.Printf("prepare failed,err:%v\n", err)
		return
	}
	defer stmt.Close()
	rows, err := stmt.Query(0)
	if err != nil {
		fmt.Printf("prepare failed:%v\n", err)
		return
	}
	defer rows.Close()
	for rows.Next() {
		err := rows.Scan(&u.Uid, &u.Name, &u.Phone)
		if err != nil {
			fmt.Printf("scan failed %v\n", err)
			return
		}
		fmt.Printf("uid:%d name:%s phone:%s\n", u.Uid, u.Name, u.Phone)
	}
}

// 预处理插入
func prepareInsert() {
	stmt, err := db.Prepare("insert into user(name,phone) values (?,?)")
	if err != nil {
		fmt.Printf("prepare failed,err:%v\n", err)
		return
	}
	defer stmt.Close()
	_, err = stmt.Exec("barry", 18799887766)
	if err != nil {
		fmt.Printf("insert failed,err:%v\n", err)
		return
	}
	_, err = stmt.Exec("jim", 18999999999)
	if err != nil {
		fmt.Printf("insert failed,err:%v\n", err)
		return
	}
	fmt.Printf("insert success")
}

// 事务操作
func transaction() {
	tx, err := db.Begin()
	if err != nil {
		if tx != nil {
			tx.Rollback()
		}
		fmt.Printf("begin trans failed,err:%v\n", err)
		return
	}
	_, err = tx.Exec("update user set name='james' where uid=?", 1)
	if err != nil {
		tx.Rollback()
		fmt.Printf("exec sql1 failed,err:%v\n", err)
		return
	}
	_, err = tx.Exec("update user set name='james' where uid=?", 3)
	if err != nil {
		tx.Rollback()
		fmt.Printf("exec sql2 failed,err:%v\n", err)
		return
	}
	tx.Commit()
	fmt.Printf("exec transaction success!")
}

// SQL 自行拼接语句,会好不要这样写,会被注入,引发安全问题
func sqlInject(name string) {
	sqlStr := fmt.Sprintf("select uid, name, phone from user where name='%s'", name)
	fmt.Printf("SQL:%s\n", sqlStr)
	rows, err := db.Query(sqlStr) // 使用 db.Query 执行查询语句
	if err != nil {
		fmt.Printf("query failed,err:%v\n", err)
		return
	}
	defer rows.Close()
	for rows.Next() {
		u := User{}
		err := rows.Scan(&u.Uid, &u.Name, &u.Phone)
		if err != nil {
			fmt.Printf("scan failed %v\n", err)
			return
		}
		fmt.Printf("uid:%d name:%s phone:%s\n", u.Uid, u.Name, u.Phone)
	}
}

func main() {
	err := initDB()
	if err != nil {
		fmt.Printf("init db failed,err:%v\n", err)
	}
	sqlInject("james")
}

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

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

相关文章

使用python实现http协议的方法

要使用Python编写一个接口,其入参格式为x-www-form-urlencoded,你可以使用requests库。requests库是一个流行的HTTP库,它使得发送HTTP请求变得非常简单。 下面是一个简单的示例,展示如何使用requests库发送一个POST请求&#xff…

苹果IOS系统企业IPA文件签名需要提供APP开源代码吗?

在科技发展日益迅速的今天,我们所生活的世界已变得越来越便捷。而在这个过程中,智能手机、移动应用以及与之相关的技术也在影响着我们日常生活的方方面面。苹果公司,作为行业巨头之一,不仅改变了全球智能手机的发展趋势&#xff0…

酒石酸盐晶体是优质葡萄酒的一个特征?

来自云仓酒庄品牌雷盛红酒分享澄清一下,葡萄酒中的酒石酸盐晶体,在德国被称为“温斯坦”,既无害也不是质量差的标志,相反,它们是富含矿物质的葡萄酒的特征。虽然酒石酸盐可以在年轻的葡萄酒中结晶,但它们最…

iconfont

iconfont-阿里巴巴矢量图标库https://www.iconfont.cn/ UI - 优设网 - 学设计上优设 (uisdc.com)https://www.uisdc.com/category/uiicon TreeNode moveNode (TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode"); Point pt; …

C++问题总结

文章目录 C指针和引用的区别:悬空指针和野指针如何避免悬空指针和野指针多态析构函数可以为虚函数吗,为何建议为虚函数C程序的编译过程可以分为四个主要阶段线程池有死锁问题吗,死锁了解多少,递归锁知道吗常见的几种锁 网络什么是…

Pillow库(PIL)入门教程

Pillow库,PIL的升级版,一个免费开源的Python图像处理库。 Pillow 库(有时也称 PIL 库) 是 Python 图像处理的基础库,它是一个免费开源的第三方库,由一群 Python 社区志愿者使用 Python 语言开发而成&#…

LoongArch 指令集 流水线设计

简易版流水线 流水线总体思想-自己感悟 将指令执行分成若干个阶段(五级流水-取值,译码,执行,访存,写回),每个阶段干自己的事(生成相应的控制信号,完成自己的工作&#x…

PostgreSQL12中浮点数输出算法优化带来的小问题

最近碰到同事发来这样两个SQL,开发反馈输出的结果异常。 bill# select 0.1284*100::float;?column? --------------------12.839999999999998 (1 row)bill# select (0.1284*100)::float;float8 --------12.84 (1 row) 乍一看其实能看出明显的区别,由于…

CDN加速技术:国内外优劣势

在当今数字化时代,网站速度和性能对于用户体验和在线业务的成功至关重要。为了提供更快速的内容交付和优化用户体验,内容分发网络(CDN)技术应运而生。本文将分析CDN的国内外优劣势,探讨其价格因素,并通过实…

由浅入深,全面解析AMBA ACECHI协议

IC工程师,在设计芯片时,如果是基于各种复用IP的SOC芯片,那必定要接触到AMBA总线协议。 AMBA总线是由ARM公司提出的一种开放性的片上总线标准,它独立于处理器和工艺技术,具有高速度低功耗等特点。协议的主要动机是用一…

Android build.gradle读取String中文件及gradle.properties数据

在网上找了好久没有一个完整的学习文档,自己总结下,方便后面使用,话不多说直接上代码 首先获取路径 def path getProjectDir().getPath()"/src/"variant.productFlavors[0].name"/res/values/strings.xml"System.out…

音视频(二)之使用FFMpegSDK在我们自己的代码中进行推流

前言 上一篇文章我们介绍了如何使用FFMpeg工具进行推流。但如果要在我们的代码工程中,实现推流。就要下载FFMpegSDK包,调用相关API,在我们自己的程序中实现推流。 FFMpegSDK下载 下载动态库文件 选择这个下载 使用FFMpegSDK推流 下载FF…

jacob朗读中文,jacob生成中文语音音频文件,以生成MP3文件为例,不需要配置DLL

前言 本文使用jacob朗读文字和生成中文语音音频文件功能,与不同的是,本文不需要配置DLL到JVM根目录,只需要从项目类路径加载DLL即可。 jacob介绍 Jacob 是一个 Java 库,允许 Java 应用程序与Microsoft Windows DLL 或 COM 库进行通信。它通过使用自定义DLL来实现这一点,…

docker镜像仓库

Hlarbor harbor是一个开源的云原生镜像仓库, 它允许仓库用户存储,使用docker镜像。可以将harbor看做是私有的dockerhub,它提供了更新安全性和控制性, 让组织能够安全的存储和管理镜像。 harbor RBAC:基于角色访问控制…

ImportError: DLL load failed: 找不到指定的模块。解决方法 from ._nnls import nnls 报错

实验时遇到过如下错误 ImportError: DLL load failed: 找不到指定的模块。 往前查看错误位置发现如下错误 from ._nnls import nnls 或者 from scipy import special, optimize, from ._nnls import nnls 解决方法: 依次执行下述命令 conda remove --force numpy …

[大三上]区块链和分布式计算

[大三上]区块链和分布式计算 区块链中的分布式系统: 分布式最大的应用: 区块链, 分布式系统是区块链的一个基础 分布式计算: 分布式计算(Distributed Computing):指将一个计算任务分解成多个子任务,分配给不同的计算节点&#…

项目管理-2023西电网课课后习题答案-第三章

文章目录 第三章答案1-1011-2021-3031-4041-5051-6061-7071-80 [✅] 第一章答案[✅] 第二章答案[✅] 第三章答案[✅] 第四章答案 第五章答案 第三章答案 1-10 11-20 21-30 31-40 41-50 51-60 61-70 71-80

VSCode 自动修改闭合标签

1.打开应用商店,搜索 auto rename tag ,选择第一个,点击安装。 2.安装完毕后随便打开一个 HTML 文件,当我们修改起始标签时,闭合标签也会自动更改。 原创作者:吴小糖 创建时间:2023.10.25

高德 几千条数据,点标记Marker转海量标注 LabelMarker

** 高德地图说: 当需要在地图添加千级以上的点标记时,LabelMarker 是代替 Marker 的更好选择。 ** 如图,当数据量超过两千时,如果我们使用的是Marker点标记,页面将会非常的卡,卡顿很久都不出现标记点。因此…

NFS网盘挂载-Ubuntu(linux)

我有2台机器,我想把A机器挂载到B机器上。 NFS安装 B机器执行-服务端:sudo apt-get install nfs-kernel-server A机器执行-客户端:sudo apt-get install nfs-common 指定共享盘 进入B机器,配置共享盘 创建需要让别人访问的目录…