用 Go 访问 MySql 数据库

#pic_center =60x60

  • 所有代码样例
package mainimport ("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   intName  stringPhone 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.mzph.cn/news/117444.shtml

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

相关文章

【JavaEE】网络原理---TCP协议的易懂图文详解(确认应答、超时重传、连接管理、滑动窗口、流量控制)

一、TCP协议 TCP,即Transmission Control Protocol,传输控制协议。人如其名,要对数据的传输进行一个详细的控制。 1.1 TCP协议格式 (为了方便排版这样化的,我们从上到下依次理解) 二、TCP原理 2.1 确…

【Spring】使用aop切面编程时要给那些类加注解

🎄欢迎来到边境矢梦的csdn博文🎄 🎄本文主要梳理 Spring 中使用aop切面编程时要给那些类加注解 🎄 🌈我是边境矢梦,一个正在为秋招和算法竞赛做准备的学生🌈 🎆喜欢的朋友可以关注一…

使用达梦数据库的总结

–修改当前会话所在模式: set schema 模式名;–创建表空间、用户名并为用户指定表空间,并为用户授权 create tablespace "RSGL_BZK" datafile REGL_BZK.DBF size 7488 autoextend on next 128 maxsize 33554431 CACHE NORMAL; create user …

UE4 中可全局获取的变量(例如游戏实例、玩家控制器等) 详解

目录 0 引言1 全局对象(全局变量)1.1 游戏实例 GameInstance1.1.1 介绍1.1.2 使用 GameInstance 1.2 玩家控制器 PlayerController1.3 游戏世界类 UWorld 🙋‍♂️ 作者:海码007📜 专栏:UE虚幻引擎专栏&…

优雅的使用String字符串处理各种类型转换

文章目录 🌟 优雅的使用String字符串处理各种类型转换🍊 基本类型转字符串🍊 字符串转基本类型🍊 字符串与字符数组的转换🍊 字符串与字节数组的转换🍊 其他类型转字符串🍊 总结 📕我…

Flask后端开发(一)-基础知识和前期准备

目录 1.背景介绍1.1. 项目背景1.2. 项目难点1.3. 项目环境 2. flask后端开发实现的功能3. flask部署和前后端对接3.1. flask运行配置和服务器部署3.2. flask前后端传参 4. 后端测试工具4.1. 工具介绍4.2. 工具使用 后记 1.背景介绍 1.1. 项目背景 就是前几个月临时接手了一个…

CPU眼里的C/C++: 1.3 汇编级单步调试函数执行过程

1. 目的 2. 基于 GDB 的汇编级单步调试 原始代码 #include <stdio.h>long test() {long a 1;a 2;return a; }int main() {int ret test();printf("test return %d\n", ret);return 0; }关键 gdb 命令 si 指令执行汇编级的单步调试info registers 读取寄…

【RocketMQ系列十四】RocketMQ中消息堆积如何处理

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精…

RabbitMQ原理(五):消费者的可靠性

文章目录 3.消费者的可靠性3.1.消费者确认机制3.2.失败重试机制3.3.失败处理策略3.4.业务幂等性3.4.1.唯一消息ID3.4.2.业务判断 3.5.兜底方案 3.消费者的可靠性 当RabbitMQ向消费者投递消息以后&#xff0c;需要知道消费者的处理状态如何。因为消息投递给消费者并不代表就一定…

Unsupervised Medical Image Translation with Adversarial Diffusion Models

基于对抗扩散模型的无监督医学图像翻译 论文链接&#xff1a;https://arxiv.org/abs/2207.08208 项目链接&#xff1a;https://github.com/icon-lab/SynDiff Abstract 通过源-目标模态转换对缺失图像进行补全可以提高医学成像方案的多样性。利用生成对抗网络(GAN)进行一次映…

Leetcode—104.二叉树的最大深度【简单】

2023每日刷题&#xff08;六&#xff09; Leetcode—104.二叉树的最大深度 递归实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/int maxDepth(struct TreeNode* root){…

分类预测 | MATLAB实现SSA-CNN-GRU-Attention数据分类预测(SE注意力机制)

分类预测 | MATLAB实现SSA-CNN-GRU-Attention数据分类预测&#xff08;SE注意力机制&#xff09; 目录 分类预测 | MATLAB实现SSA-CNN-GRU-Attention数据分类预测&#xff08;SE注意力机制&#xff09;分类效果基本描述模型描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现…

C#,数值计算——分类与推理Phylo_upgma的计算方法与源程序

1 文本格式 using System; using System.Collections.Generic; namespace Legalsoft.Truffer { public class Phylo_upgma : Phylagglom { public override void premin(double[,] d, int[] nextp) { } public override double dminfn(doubl…

structs2 重构成SpringBoot架构

# 目录 structs2 重构成SpringBoot架构 1.1 structs2架构&#xff1a; 1.2 springboot 架构 1.3 演化要点&#xff1a; 1.基于前端的展示层不需要修改 2.HttpServlet 将会有SpringBoot annotation 来处理 3.构建前置的Structs url 转发器&#xff0c;适配 4.ActionSupport将由…

C#开发的OpenRA游戏之金钱系统(5)

C#开发的OpenRA游戏之金钱系统(5) 前面分析了采矿车到矿场采矿的过程,那么采矿车什么时候采满呢?采满之后又是怎么样运送到精炼工厂呢? 首先我们来分析采矿车是怎么样判断采满矿产的,毕竟采矿车不能无限装载矿产资源。所以我们再次回到采矿车类Harvester,来分析它怎么…

上海亚商投顾:沪指放量反弹 两市超4500股飘红

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数昨日集体反弹&#xff0c;深成指、创业板指盘中涨超1%&#xff0c;黄白二线大幅分化&#xff0c;题材…

【SwiftUI模块】0060、SwiftUI基于Firebase搭建一个类似InstagramApp 3/7部分-搭建TabBar

SwiftUI模块系列 - 已更新60篇 SwiftUI项目 - 已更新5个项目 往期Demo源码下载 技术:SwiftUI、SwiftUI4.0、Instagram、Firebase 运行环境: SwiftUI4.0 Xcode14 MacOS12.6 iPhone Simulator iPhone 14 Pro Max SwiftUI基于Firebase搭建一个类似InstagramApp 3/7部分-搭建Tab…

Mybatis-Plus CRUD

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; Mybatis-Plus CRUD 通用 Service CRUD 封装 IService 接口&#xff0c;进一步封装 CRUD 采用 get 查询、remove 删除 、list 查询集合、page 分页的前缀命名方式区分 …

AlDente Pro for Mac: 掌控电池充电的终极解决方案

你是否曾经为了保护你的MacBook的电池&#xff0c;而苦恼于无法控制它的充电速度&#xff1f;AlDente Pro for Mac 是一款专为Mac用户设计的电池管理工具&#xff0c;它能帮助你解决这个问题。 AlDente Pro for Mac 是一款电池最大充电限制软件&#xff0c;它能够让你自由地设…

系统安全分析与设计

系统安全分析与设计&#xff08;2分&#xff09; 内容提要 对称加密与非对称加密 加密技术与认证技术 加密技术&#xff08;只能防止第三方窃听&#xff09; 讲解地址&#xff1a;对称加密与非对称加密_哔哩哔哩_bilibili 认证技术 骚戴理解&#xff1a;数字签名是用私钥签名…