package main

/*
下划线(如:import _ hello/imp)的作用:当导入一个包时,该包下的文件里所有init()函数都会被执行,
然而,有些时候我们并不需要把整个包都导入进来,仅仅是是希望它执行init()函数而已。
这个时候就可以使用 import _ 引用该包。
即使用【import _ 包路径】只是引用该包,仅仅是为了调用init()函数,所以无法通过包名来调用包中的其他函数。
*/
import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"database/sql"
) /*
一、database/sql接口介绍
可发者根据定义的接口来开发响应数据库驱动 1 sql.Register 注册数据库驱动,第三方开发数据库驱动时都会实现init函数,在init里面调动Register(name string, driver.Driver)
例如:
sqlite3驱动
func init(){
sql.Register("sqlite3",&AQLiteDriver{})
}
mysql驱动
var d = Driver{proto:"tcp",raddr:"1270.0.1:3306"}
func init(){
Register("SET NAMES utf8")
sql.Register("mymysql",&d) }
2 driver.Driver
Driver是一个数据库驱动的接口,定义了一个metod:Open(name string)
type Driver interface {
Open(name string) (Conn,err) {
}
}
这个方法返回一个数据库的Conn接口,返回的Conn只能用来进行一次goroutine的操作 go gorountineA(Conn)
go gorountineB(Conn)
这样两个goroutine 里面使用这个Conn,可能会导致程序不知道某个操作究竟是由哪个goroutine发起大,结果可能是将A操作结果返回了B ,B的操作结果给了A 3 diver.Conn 数据库连接的接口 这个Conn只能应用在一个goroutine,不能用在多个goroutine,详情参考2
type Conn interface{
Prepare(query string) (Stmt,err)
Close() error
Begin() (Tx,error)
}
Prepare函数返回与当前连接的相关的执行sql语句的准备状态,可以进行查询、删除等操作 Close函数 关闭当前连接,执行释放连接拥有的资源等清理工作 Begin函数 返回一个代表事务处理的Tx,通过他可以进行查询、更新等操作,或者对事物进行回滚、递交 4 driver.Stmt 是一种准备好的状态,和Conn相关联 只能应用于一个goroutine
type Stmt interface {
Close() error
Numlnput()int
Exec(args []Value) (Result,error)
Query(args []Value) (Rows,error)
}
Close函数 关闭当前连接,如果当前正在执行query,query还是有效并返回rows数据
Numlnput函数 返回当前预留参数的个数,当返回 大于等于零时数据库驱动就会智能检查调用者的参数。当数据库驱动包不知道预留参数的时候,返回-1
Exec函数 执行Prepare准备好的sql,传入参数执行update/insert等操作,返回Result数据
Query函数 执行Prepare准备好的sql,传入需要的参数执行select操作,返回Rows结果集 5 dirver.Execer
type Execer interface {
Exec(query string, args []Value) (Result,error)
}
这是一个Conn可选择实现的接口
如果没有定义这个接口,在调用DB.Exec时,就会实现调用Prepare返回Stmt,然后执行Stmt的Exec,最后关闭Stmt 6 dirver.Result
type Result interface {
LastInsertId()(int64,error)
RowsAffected()(int64,error)
}
这是执行Update/Insert等操作返回的结果接口定义
LastInsertId函数 返回有数据库执行插入操作得到的自增ID号
RowsAffected函数 返回query操作影响的数据条目数 7 driver.Rows
type Rows interface {
Columns() []string
Close() error
Next(dest []Value) error
}
这是执行查询返回的结果集接口
Columns函数 返回查询数据库表的字段信息,这个返回的slice和sql查询字段一一对应,而不是返回整个表的所有字段
Close函数 用来关闭Rows迭代器
Next函数 用来返回下一条数据,把数据赋值给dest。dest里面的元素必须是dirver,Value的值除了string,返回的数据中心所有的string都必须转换成[]byte。如果最后没有数据了,Next函数最后返回io.EOF 8 driver.RowsAffected 其实就是基础类型是int64的自定义类型
type RowsAffected int64 9 dirver.Value
type Value interface{}
这是一个空接口,可以容纳任何数据
Value要么是nil,要么是下面的任意一种
int64
float64
bool
[]byte
string
time.Time
10 driver.ValueConverter
type ValueConverter interface {
// ConvertValue converts a value to a driver Value. 把普通的值转化成dirver.Value的接口
ConvertValue(v interface{}) (Value, error)
}
12 dirver.Valuer
type Valuer interface{
Value() (Value,error)
}
valuer接口定义了一个返回dirver.Value的方式 */ /* 二使用mysql数据库
go语言中支持mysql的驱动,有些支持database/sql标准,有些是采用了自己的实现接口。比较常用的:
https://github.com/Go-SQL-Driver/MYSQL 支持database/sql 【比较新,支持长连接,线程安全,完全支持database/sql接口】
https://github.com/ziutek/mymysql 支持database/sql 也支持自定义的接口
https://github.com/Philio/GoMySQL 不支持database/sql,自定义接口
*/ /*
准备
CREATE TABLE test.userinfo (
uid INT auto_increment NOT null primary key,
username varchar(100) NULL,
departname varchar(100) NULL,
created DATE NULL
)
CREATE TABLE test.userdetail (
uid INT auto_increment NOT null primary key,
intro TEXT NULL,
profile TEXT NULL
) */
func checkERR(err error){
if err!=nil{
panic(err)
}
}
func main() {
//打开数据库驱动
/* 补充 数据库信息支持:
user@unix(/path/to/socket)/dbname?charset=utf8
user:password@tcp(ip:port)/dbname?charset=utf8
user:password@/dbname
user:password@tcp([de:ad:be:ef:ca:fe]:80)/dbname
*/
db,err:=sql.Open("mysql","root:qwer123!@tcp(10.10.187.150:3306)/test")
checkERR(err)
//增
//返回准备要执行的sql操作,然后返回准备完毕的执行状态 =? 可以一定程度上防止sql注入
//stmt,err:=db.Prepare("insert userinfo set username=?,departname=?,created=?")
//checkERR(err)
//// 执行 stmt准备好的sql语句
//res,err:=stmt.Exec("wzg","研发","2022-02-10")
//checkERR(err)
//id,err:=res.LastInsertId()
//checkERR(err)
//fmt.Println(id)
////改
//stmt,err :=db.Prepare("update userinfo set username=? where uid=?")
//checkERR(err)
//res,err := stmt.Exec("wzgupdate",2)
//checkERR(err)
//affect,err:= res.RowsAffected()
//checkERR(err)
//fmt.Println(affect)
////查
////执行sql返回rows结果集
//rows,err:=db.Query("select * from userinfo")
//checkERR(err)
////Next()方法可以到下一个结果
//for rows.Next(){
// var uid int
// var username string
// var department string
// var created string
// err = rows.Scan(&uid,&username,&department,&created) //Scan copies the columns in the current row into the values pointed at by dest. The number of values in dest must be the same as the number of columns in Rows.
// checkERR(err)
// fmt.Println(uid)
// fmt.Println(username)
// fmt.Println(department)
// fmt.Println(created)
//}
//删
stmt,err := db.Prepare("delete from userinfo where uid=?")
checkERR(err)
res,err:= stmt.Exec(2)
checkERR(err)
affect,err:= res.RowsAffected()
checkERR(err)
fmt.Println(affect)
db.Close()
}

go 使用mysql的更多相关文章

  1. Hadoop 中利用 mapreduce 读写 mysql 数据

    Hadoop 中利用 mapreduce 读写 mysql 数据   有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...

  2. mysql每秒最多能插入多少条数据 ? 死磕性能压测

    前段时间搞优化,最后瓶颈发现都在数据库单点上. 问DBA,给我的写入答案是在1W(机械硬盘)左右. 联想起前几天infoQ上一篇文章说他们最好的硬件写入速度在2W后也无法提高(SSD硬盘) 但这东西感 ...

  3. LINUX篇,设置MYSQL远程访问实用版

    每次设置root和远程访问都容易出现问题, 总结了个通用方法, 关键在于实用 step1: # mysql -u root mysql mysql> Grant all privileges o ...

  4. nodejs进阶(6)—连接MySQL数据库

    1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...

  5. MySQL高级知识- MySQL的架构介绍

    [TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...

  6. 闰秒导致MySQL服务器的CPU sys过高

    今天,有个哥们碰到一个问题,他有一个从库,只要是启动MySQL,CPU使用率就非常高,其中sys占比也比较高,具体可见下图. 注意:他的生产环境是物理机,单个CPU,4个Core. 于是,他抓取了CP ...

  7. 我的MYSQL学习心得(一) 简单语法

    我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  8. Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制

    将通用的序列号生成器库 从SQL Server迁移到Mysql 遇到的一个问题,就是TimeStamp/RowVersion并发控制类型在非Microsoft SQL Server数据库中的实现.SQ ...

  9. Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境

    首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...

  10. 当忘记mysql数据库密码时如何进行修改

    因为长时间没有使用数据库了,或者把密码改完之后就忘了数据库密码,不能正常进入数据库,也无法修改密码,有一个简单的常用修改密码方式: 1.首先找到和打开mysql.exe和mysqld.exe所在的文件 ...

随机推荐

  1. Rocky Linux安装

    1.下载 VirtualBox并安装 https://www.virtualbox.org/wiki/Downloads 2.下载Rocky Linux 选择 Rocky-9.1-x86_64-dvd ...

  2. FCoE简单介绍

    目录 FCoE 使用前提 FCoE FCoE是一种融合网络技术,其目的是将FC帧封装到以太网帧中,实现以太网链路与光纤链路通信的功能. SAN一般指存储区域网络,FC SAN 有光纤组网,IP SAN ...

  3. clicknium-划时代的自动化

    说起UI自动化,selenium一直是不可替代的存在,它的安装量.百度数量已经奠定了它在自动化.爬虫等相关领域的霸主低位,可以说,只要涉及到UI自动化,选selenium就对了. 细数过往,相关的UI ...

  4. Postman操作指南

    基本使用 基本使用在这里不做记录,大多数人下载完就会用.这里记一下重点. 抓包浏览器 浏览器安装插件postman interceptor:插件在postman-interceptor界面最下面提示的 ...

  5. vue的两种服务器端渲染方案

    作者:京东零售 姜欣 关于服务器端渲染方案,之前只接触了基于react的Next.js,最近业务开发vue用的比较多,所以调研了一下vue的服务器端渲染方案. 首先:长文预警,下文包括了两种方案的实践 ...

  6. OpenLayers入门练习

    一.实验内容 练习OpenLayers的引用形式; 简单地图加载; 控件加载. 二.实验步骤 2.1 ol引用 <!doctype html> <html lang="zh ...

  7. 一键接入 ChatGPT,让你的QQ群变得热闹起来

    目录 项目效果 安装环境 配置文件 启动Mirai 启动ChatGPT 项目效果 ChatGPT 的出现对于人们的生活和工作都有着重要的影响,作为一个强大的自然语言处理模型,可以理解和生成自然语言,所 ...

  8. Shiro+SpringBoot前后端分离中跨域,sessionId,302问题

    1.解决跨域 @Configuration public class CorsConfig { public CorsConfiguration buildConfig() { CorsConfigu ...

  9. 【剑指Offer】【树】从上到下打印二叉树(层序遍历)

    题目:从上往下打印出二叉树的每个节点,同层节点从左至右打印. A:创建一个辅助队列,将根节点入队,添加到输出的vector中 循环:到队为空为止 若二叉树有左结点则将左节点入队 若二叉树有右节点则将右 ...

  10. C++用递归实现求解相关函数

    //递归实现Hanoi塔问题#include<iostream>#include<cstdlib>using namespace std;#define MAXSIZE 100 ...