go 使用mysql
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的更多相关文章
- Hadoop 中利用 mapreduce 读写 mysql 数据
Hadoop 中利用 mapreduce 读写 mysql 数据 有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...
- mysql每秒最多能插入多少条数据 ? 死磕性能压测
前段时间搞优化,最后瓶颈发现都在数据库单点上. 问DBA,给我的写入答案是在1W(机械硬盘)左右. 联想起前几天infoQ上一篇文章说他们最好的硬件写入速度在2W后也无法提高(SSD硬盘) 但这东西感 ...
- LINUX篇,设置MYSQL远程访问实用版
每次设置root和远程访问都容易出现问题, 总结了个通用方法, 关键在于实用 step1: # mysql -u root mysql mysql> Grant all privileges o ...
- nodejs进阶(6)—连接MySQL数据库
1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...
- MySQL高级知识- MySQL的架构介绍
[TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...
- 闰秒导致MySQL服务器的CPU sys过高
今天,有个哥们碰到一个问题,他有一个从库,只要是启动MySQL,CPU使用率就非常高,其中sys占比也比较高,具体可见下图. 注意:他的生产环境是物理机,单个CPU,4个Core. 于是,他抓取了CP ...
- 我的MYSQL学习心得(一) 简单语法
我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...
- Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制
将通用的序列号生成器库 从SQL Server迁移到Mysql 遇到的一个问题,就是TimeStamp/RowVersion并发控制类型在非Microsoft SQL Server数据库中的实现.SQ ...
- Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境
首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...
- 当忘记mysql数据库密码时如何进行修改
因为长时间没有使用数据库了,或者把密码改完之后就忘了数据库密码,不能正常进入数据库,也无法修改密码,有一个简单的常用修改密码方式: 1.首先找到和打开mysql.exe和mysqld.exe所在的文件 ...
随机推荐
- ve-plus:基于 vue3.x 桌面端UI组件库|vue3组件库
VE-Plus 自研轻量级 vue3.js 桌面pc端UI组件库 经过一个多月的筹划及开发,今天给大家带来一款全新的Vue3桌面端UI组件库VEPlus.新增了35+常用的组件,采用vue3 setu ...
- gin 01
1.gin介绍: 2.gin的安装 go get -u github.com/gin-gonic/gin 3.gin的第一个helloWord package main import ( " ...
- LeetCode-440 字典序的第K小数字
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/k-th-smallest-in-lexicographical-order 题目描述 给定整数 ...
- LeetCode-537 复数乘法
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/complex-number-multiplication 题目描述 复数 可以用字符串表示,遵循 ...
- java学习日记20230227-dos原理
DOS原理 磁盘操作系统 dis operating system md c:\\temp 创建文件夹 rd c:\\jyltemp 移除文件夹 相对路径和绝对路径 相对路径:从当前目录开始定位形 ...
- CF623A Graph and String
个人思路: 显然,和其他所有点连边的点都是 b.我们接下来不考虑这些点. 剩余 a 和 c 必然自己形成一个连通块,每个点与块内其他所有点连边. 超过 \(2\) 个连通块,或存在点没有与块内其他所有 ...
- 解决React 安装 antd 后出现的Module not found: Can't resolve './locale' in '...rc-picker/node-modules.....'一系列问题问题
最近看到很多小伙伴发现了antd的这个问题,试用了网上的办法不行,我自己想了一种可行的方法,大家可以试一试. 有位大佬用了yarn eject 方式 ,通过暴露config配置,在config.web ...
- 这个仅2M的宝藏小工具,竟无需群发就能揪出微信所有单向好友!
背景:很多人平时微信跟人发消息的时候,发现自己已经被对方清理掉了,因此可能想把自己的微信单向好友都清理出去."转账验证好友"是大部分人已经都知道的方法,但是好友太多,我们实在是无法 ...
- docker配置文件模板
{ "registry-mirrors": [ "https://bxsfpjcb.mirror.aliyuncs.com" ], "max-conc ...
- git 的提交与合并
1,创建远程仓库 不论是用命令行还是码云之类的都可以 2,git clone url 这是将远程仓库库提交到本地 3, git checkout -b dev 创建dev分支并切换到dev ...