golang之数据库操作

1.导入必要的包

import("database/sql"_ "github.com/go-sql-driver/mysql" //使用此作为数据库驱动
)

2.相关操作

连接数据库

使用sql.Open()函数进行数据库的连接

 db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/dbname")
//用户名:密码@tcp(127.0.0.1:3306)/你要连接的数据库if err != nil {panic(err)}defer db.Close()
//使用完毕后不要忘了关闭
package mainimport("database/sql"_ "github.com/go-sql-driver/mysql""fmt"
)func main(){db,err :=sql.Open("mysql","root:123456@tcp(127.0.0.1:3306)/mydb")//db是 *sql.DB 使用Open函数打开目标的IP的指定数据库if err !=nil {fmt.Println("open error")return }fmt.Printf("type is %T\n",db)err = db.Ping()//Ping一下 看是否真的连接成功
if err != nil {panic(err)
}
fmt.Println("Connected to database!")defer db.Close()
}

运行可能出现如下错误:说明数据库拒绝访问,需要使用mysql_native_password插件。

 解决上面问题执行如下SQL语句:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY yourpass;
//上面输入你的密码
FLUSH PRIVILEGES;    

SQL查询

先执行如下SQL语句创建表和填入方法

create table user ( uid int primary key auto_increment,name varchar(20) default '', 
phone varchar(20) default '') engine=innodb;insert into user(name,phone) values('a','111'),('b','222'),('c','333');

1).使用QueryRow()方法进行单行查询

func (db* DB) QueryRow(query string,args ...interface{}) *Row
此方法执行一次 最多只能返回一行数据 并且直到返回值的Scan()方法被调用后才会返回
被延迟的错误,不推荐使用
package main
import("database/sql"_ "github.com/go-sql-driver/mysql""fmt"
)type User struct {Uid intName stringPhone string
}func main(){db,err :=sql.Open("mysql","root:123456@tcp(127.0.0.1:3306)/mydb")if err !=nil {fmt.Println("open error")return }fmt.Printf("type is %T\n",db)err = db.Ping()
if err != nil {panic(err)
}
fmt.Println("Connected to database!")defer db.Close()user1 :=User{}
err =db.QueryRow("select uid,name,phone from user where uid=2").Scan(&user1.Uid,&user1.Name,&user1.Phone)if err !=nil {fmt.Println("sql Query error")return}fmt.Println(user1.Uid," ",user1.Name," ",user1.Phone)
}

 2)Query()查询多行结果

user1 :=User{}
rows ,err :=db.Query("select uid,name,phone from user")//返回error和 *rowsif err !=nil {fmt.Println("sql Query error")return}defer rows.Close()//关闭ROWS 释放所有的数据库连接//循环读取结果集中的数据 储存在结构体中for rows.Next(){err =rows.Scan(&user1.Uid,&user1.Name,&user1.Phone)if err !=nil {fmt.Println("Scan error")return}fmt.Println(user1.Uid," ",user1.Name," ",user1.Phone)}

3). db.Exec(sql string) (Result,error)可以进行表数据的增删改 .

result,err :=db.Exec("insert into user(name,phone) values('d','444')")//SQL中的字符串类型用单引号  函数执行返回(result,error)类型
if err !=nil {fmt.Println("insert error")return
}lastInsertID, err := result.LastInsertId()//获得插入数据的主键部分if err !=nil {fmt.Println("get ID error")return}fmt.Println("insert success, the id is ",lastInsertID)//剩下的删和该是一样的

4)事务操作

begin()方法开启事务:func (db *DB) Begin() (*Tx,error)

Commint()提交事务: func (tx *Tx) commit () error 

Rollback()回滚事务: func (tx *Tx) Rollback() error

package main
import("database/sql"_ "github.com/go-sql-driver/mysql""fmt"
)type User struct {Uid intName stringPhone string
}func main(){db,err :=sql.Open("mysql","root:123456@tcp(127.0.0.1:3306)/mydb")if err !=nil {return }err = db.Ping()
if err != nil {panic(err)
}fmt.Println("Connected to database!")defer db.Close()tx, err :=db.Begin() //开启事务if err!=nil {if tx!=nil {tx.Rollback()}fmt.Println("begin trans failed")return }_,err1 :=tx.Exec("update user set name = 'ggg' where phone = '444'")if err1 !=nil {tx.Rollback()//执行失败 进行回滚事务fmt.Println("sal update failed")return}tx.Commit()//提交事务fmt.Println("exec transaction success!")
}

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

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

相关文章

为ARM64架构移植Ubuntu20.04换源的发现

在为ARM64架构(RK3566)移植ubuntu20.04的时候发现在更换为国内源之后,无法正常完成apt update,报错为: Ign:25 http://mirrors.aliyun.com/ubuntu focal-updates/main arm64 Packages …

源码编译安装httpd 2.4,提供系统服务管理脚本并测试

总结需要安装的包 sudo yum groupinstall "Development Tools" -y #httpd的依赖包yum install tar -y #tar压缩包sudo yum install apr-devel apr-util-devel #APR库 提供跨平台接口的库sudo yum install pcre pcre-devel # PCRE库和 pcre-config工具--提供PCRE库…

【混合开发】CefSharp+Vue桌面应用程序开发

为什么选择CefSharpVue做桌面应用程序 CefSharp 基于 Chromium Embedded Framework (CEF) ,它可以将 Chromium 浏览器的功能嵌入到 .NET 应用程序中。通过 CefSharp,开发者可以在桌面应用程序中集成 Web 技术,包括 HTML、JavaScript、CSS 等…

从0开始学习搭网站第二天

前言:今天比较惭愧,中午打铲吃了一把,看着也到钻二了,干脆顺手把这个赛季的大师上了,于是乎一直到网上才开始工作,同样,今天的学习内容大多来自mdn社区mdn 目录 怎么把文件上传到web服务器采用S…

nacos环境搭建以及SpringCloudAlibaba脚手架启动环境映射开发程序

1:下载nacos 地址:https://github.com/alibaba/nacos/tags 2:选择server的zip包下载 3:启动mysql服务,新建数据库:nacos_yh 4:解压下载的nacos_server 进入conf目录 5:mysql运行sql脚本变得到下面的表 6&a…

Spring MVC流程一张图理解

由于现在项目中大部分都是使用springboot了,但是ssm中的springmvc还是可以了解一下 1 、用户发送请求至前端控制器 DispatcherServlet 。 2 、 DispatcherServlet 收到请求调用 HandlerMapping 处理器映射器。 3 、处理器映射器找到具体的处理器 ( 可以根据 xml 配…

数据分析如何正确使用ChatGPT进行辅助?

目录 1.数据介绍 2.特征工程 3.EDA分析 4.数据相关性分析 5.分析总结 一篇优秀的学术论文,肯定有新颖、适当的论证视角,选择恰当的研究方法,搭建逻辑严密、平衡的论证框架,把有力的数据分析紧密结合起来,这样一篇…

学习 Git 的工作原理,而不仅仅是命令

Git 是常用的去中心化源代码存储库。它是由 Linux 创建者 Linus Torvalds 创建的,用于管理 Linux 内核源代码。像 GitHub 这样的整个服务都是基于它的。因此,如果您想在 Linux 世界中进行编程或将 IBM 的 DevOps Services 与 Git 结合使用,那…

赛灵思(Xilinx)公司Artix-7系列FPGA

苦难从不值得歌颂,在苦难中萃取的坚韧才值得珍视; 痛苦同样不必美化,从痛苦中开掘出希望才是壮举。 没有人是绝对意义的主角, 但每个人又都是自己生活剧本里的英雄。滑雪,是姿态优雅的“贴地飞行”,也有着成…

openplant实时数据库(二次开发)

资源地址 我的网盘〉软件>数据库>openplant>openplant实时数据库(二次开发)

SpringBoot链接Kafka

一、SpringBoot生产者 (1)修改SpringBoot核心配置文件application.propeties, 添加生产者相关信息 # 连接 Kafka 集群 spring.kafka.bootstrap-servers192.168.134.47:9093# SASL_PLAINTEXT 和 SCRAM-SHA-512 认证配置 spring.kafka.properties.securi…

Win11下python 调用C++动态链接库dll

这里写自定义目录标题 Win11下python 调用C动态链接库dll环境修改C语言代码Visual Studio 2019生成dllPython 加载DLLpython 数据类型适配python调用函数 Win11下python 调用C动态链接库dll 在一些耗时的函数上考虑使用C进行加速,涉及把cpp文件转为dll,…

探索 Transformer²:大语言模型自适应的新突破

目录 一、来源: 论文链接:https://arxiv.org/pdf/2501.06252 代码链接:SakanaAI/self-adaptive-llms 论文发布时间:2025年1月14日 二、论文概述: 图1 Transformer 概述 图2 训练及推理方法概述 图3 基于提示的…

CSRF(跨站请求伪造)深度解析

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

5、docker-compose和docker-harbor

安装部署docker-compose 自动编排工具,可以根据dockerfile自动化的部署docker容器。是yaml文件格式,注意缩进。 1、安装docker-compose 2、配置compose配置文件docker-compose.yml 3、运行docker-compose.yml -f:指定文件,up&…

QNAP 上常用的几款软件

当我们谈到 NAS(Network Attached Storage)时,QNAP 凭借多年的产品迭代、稳定的硬件性能和不断丰富的软件生态,已成为很多家庭及中小型企业的首选。除了存储本身,QNAP 提供的各种官方软件和应用,也为用户带…

Jmeter进行http接口并发测试

目录: 1、Jmeter设置(1)设置请求并发数(2)设置请求地址以及参数(3)添加结果数 2、启动看结果 1、Jmeter设置 (1)设置请求并发数 (2)设置请求地址…

9,STL——vector类

一、vector类的介绍和使用 1,了解vector vector类的官方介绍https://cplusplus.com/reference/vector/vector/ 使用STL的三个境界:能用,明理,能扩展 1). vector是表示可变大小数组的序列容器。 2). 就像数组一样,…

基于考研概率论知识解读 Transformer:为何自注意力机制要除以根号 dk

Transformer自注意力机制中除以 d k \sqrt{d_k} dk​ ​深度剖析 【 Transformer 系列,故事从 d k \sqrt{d_k} dk​ ​说起】 LLM这么火,Transformer厥功甚伟,某天心血来潮~,再去看看! 它长这个样子: 深入…

Kafka权威指南(第2版)读书笔记

目录 Kafka生产者——向Kafka写入数据生产者概览创建Kafka生产者bootstrap.serverskey.serializervalue.serializer 发送消息到Kafka同步发送消息 Kafka生产者——向Kafka写入数据 不管是把Kafka作为消息队列、消息总线还是数据存储平台,总是需要一个可以往Kafka写…