1、下载Go-Mysql-Driver

go get github.com/go-sql-driver/mysql

2、引入import

import(
"database/sql"
_"github.com/Go-SQL-Driver/MySQL"
"log"
"strconv"
//"reflect" //获取变量类型用
)

3、增:

func main (){
//insert
name := "name"
pwd := "password"
nickname := "nickname"
db,err := sql.Open("mysql","go_mysql_user:go_mysql_pwd@tcp(localhost:3306)/go_mysql?charset=utf8")
if err != nil{
panic(err.Error())
log.Println(err)
return
}
defer db.Close() //只有在前面用了 panic[抛出异常] 这时defer才能起作用,如果链接数据的时候出问题,他会往err写数据。defer:延迟,这里立刻申请了一个关闭sql 链接的操作,defer 后的方法,或延迟执行。在函数抛出异常一会被执行
insert_sql := "insert into users (name,pwd,nickname) value (?,?,?),(?,?,?),(?,?,?),(?,?,?)"
stmt,err := db.Prepare(insert_sql) //准备一个sql操作,返回一个*Stmt,用户后面的执行,这个Stmt可以被多次执行,或者并发执行
/*
* 这个stmt的主要方法:Exec、Query、QueryRow、Close
*/
if err != nil {
log.Println(err)
return
}
res,err := stmt.Exec(name,pwd,nickname,name,pwd,nickname,name,pwd,nickname,name,pwd,nickname)
if err != nil {
log.Println(err)
return
}
lastInsertId,err := res.LastInsertId() //批量插入的时候LastInserId返回的是第一条id,单条插入则返回这条的id
//lastInsertId,err := res.RowsAffected() //插入的是后RowsAffected 返回的是插入的条数
if err != nil {
log.Println(err)
return
}
//log.Println(reflect.TypeOf(lastInsertId)) //打印变量类型
last_insert_id_string := strconv.FormatInt(lastInsertId,) //int64 转string 需要引入 strconv包
log.Println("lastInsertId = " + last_insert_id_string)
}

4、删

func main (){
//delete
del_sql := "delete from users where id=?"
del_stmt,del_err := db.Prepare(del_sql)
del_stmt.Exec()//不返回任何结果
}

5、改

func main (){
//update
update_sql := "update users set name=? where id=?"
update_stmt,update_err := db.Prepare(update_sql)
if update_err != nil {
log.Println(update_err)
return;
}
update_res,update_err := update_stmt.Exec("username",)
if update_err != nil {
log.Printf("%v",update_err)
return
}
affect_count,_ := update_res.RowsAffected() //返回影响的条数,注意有两个返回值
log.Printf("%v",affect_count)
}

6、查一条

type User struct{
id int
name string
pwd string
nickname string
} func main (){
//select
var user User
select_sql := "select * from users where id > ?"
select_err := db.QueryRow(select_sql,).Scan(&user.id,&user.name,&user.pwd,&user.nickname)//查询一条,返回一条结果。并赋值到user这个结构体类型的变量中,就算查询到的是多条,单返回的还是一条
if select_err != nil {//如果没有查询到任何数据就进入if中err:no rows in result set
log.Println(select_err)
return
}
log.Println(user)
}

7、查多条

func main (){
//查询多条
select_rows,select_err := db.Query(select_sql,)
if select_err != nil {
log.Println(select_err)
return
}
defer select_rows.Close()
for select_rows.Next(){
var id int
var name string
var pwd string
var nickname string
if err := select_rows.Scan(&id,&name,&pwd,&nickname); err != nil {
log.Println(err)
return
}
log.Printf("id=%v,name=%v,pwd=%v,nickname=%v",id,name,pwd,nickname)
} }

8、事务

func main (){

    //事务
tx,err := db.Begin() //声明一个事务的开始
if err != nil {
log.Println(err)
return
}
insert_sql := "insert into users (name,pwd,nickname) value(?,?,?)"
insert_stmt,insert_err := tx.Prepare(insert_sql)
if insert_err != nil {
log.Println(insert_err)
return
}
insert_res,insert_err := insert_stmt.Exec("tx_name","tx_pwd","tx_nickname")
last_insert_id,_ := insert_res.LastInsertId()
log.Println(last_insert_id)
defer tx.Rollback() //回滚之前上面的last_login_id是有的,但在回滚后该操作没有被提交,被回滚了,所以上面打印的Last_login_id的这条数据是不存在于数据库表中的
//tx.Commit() //这里提交了上面的操作,所以上面的执行的sql 会在数据库中产生一条数据 }

9、总结

db,err := sql.Open("mysql","数据库登录名:数据库密码@tcp(服务器:端口)/数据库名?charset=utf8") 对应修改;
defer db.Close()  defer 是延迟或异常或者该方法结束时执行的操作。这里表示有异常就关闭db 可与 panic(err.Error())=》抛出异常。配合使用。一种情况不可执行=》你的方法进入了死循环,该方法不会结束与异常则不可执行。
LastInsertId()  获取插入第一条的id  有用
RowsAffected()  获取影响/插入的条数  有用
reflect.TypeOf(i)  reflect包中TypeOf 返回的是变量i的类型
strconv.FormatInt(int64位变量,)  strconv包中FormatInt将int64位的变量转为string

10、附github地址

https://github.com/go-sql-driver/mysql

Go-MySQL-Driver的更多相关文章

  1. Qt5.7中使用MySQL Driver

    Qt5.7中使用MySQL Driver 1.使用环境 Qt5.7的安装安装就已经带了MySQL Driver,只需要在安装的时候选择一下即可. 如果没有安装,可以采取自己编译的方式. 在Qt的源码包 ...

  2. com.mysql.jdbc.Driver 与 org.gjt.mm.mysql.Driver的区别

    com.mysql.jdbc.Driver的前身是org.gjt.mm.mysql.Driver,现在主要用com.mysql.jdbc.Driver,但为了保持兼容性保留了org.gjt.mm.my ...

  3. MySQL driver for Node

    [MySQL driver for Node] 1.安装 2.一个示例 From this example, you can learn the following: Every method you ...

  4. Qt5.7中使用MySQL Driver(需要把libmysql.dll文件拷贝到Qt的bin目录中。或者自己编译的时候,链接静态库)

    Qt5.7中使用MySQL Driver 1.使用环境 Qt5.7的安装安装就已经带了MySQL Driver,只需要在安装的时候选择一下即可.如果没有安装,可以采取自己编译的方式.在Qt的源码包的q ...

  5. 关于MySQL的驱动org.gjt.mm.mysql.Driver

    今天看了一个比较老视频使用org.gjt.mm.mysql.Driver来驱动连接,便试了一下看看怎么样,结果一直连不上数据库,后来看了tomcat的后台发现有报这个问题,于是把驱动改成com.mys ...

  6. [大数据技术]Kettle初次连接MySQL数据库 报错问题 错误连接数据库 Error occured while trying to connect to the database Exception while loading class org.gjt.mm.mysql.Driver

    报错内容如下: 错误连接数据库 [foodmartconn] : org.pentaho.di.core.exception.KettleDatabaseException: Error occure ...

  7. QT:MYSQL driver not loaded解决方法

    0.参考(按对本人帮助从高到低排列) Qt5.14.1 如何编译和使用mysql和mariadb数据库驱动 (15条消息) QMYSQL driver not loaded 的原理和解决办法_m158 ...

  8. jdbc mysql driver 6.0.2

    url = jdbc:mysql://localhost:3306/hibernate?useUnicode=true&characterEncoding=UTF-8&useLegac ...

  9. Django的MySQL Driver配置

    PEP 249规定了Python的数据库API.MySQL主要有三种API实现: MySQLdb 是Andy Dustman开发的.使用原生代码/C语言绑定的驱动,它已经开发了数十年. mysqlcl ...

  10. kettle 连接 mysql 出错 Driver class 'org.gjt.mm.mysql.Driver' could not be found, make sure the ……

    解决办法:1: 首先,到官网下载mysql-connector-java. 2: 把驱动文件放置在data-integration\lib\ 目录下

随机推荐

  1. 应用栈解决迷宫问题的C语言实现

    题目来自于严蔚敏<数据结构>,参考伪代码实现的程序: #include <stdio.h> #include <malloc.h> //记录通道块在迷宫矩阵当中的横 ...

  2. C++.Linux下redis编程:error while loading shared libraries: libhiredis.so.0.13

    编译 sudo gcc -o sltest01 sltest01.c -L/usr/local/lib/ -lhiredis 运行 sudo ./sltest01 编译成功后运行报错信息: ./slt ...

  3. ADC and DAC Analog Filters for Data Conversion

    Figure 3-7 shows a block diagram of a DSP system, as the sampling theorem dictates it should be. Bef ...

  4. excel两张表数据匹配数据(VLOOKUP)

    最近项目中需要跨项目导入数据,现整理Excel的一个小技能,记录如下. 第一步:我们打开一个excel表,创建数据如下. 第二步:我们把光标定位在需要展示数据的单元格中,如下图所示. 第三步:我们可以 ...

  5. 微信小程序富文本渲染组件html2wxml及html2wxml代码块格式化在ios下字体过大问题

    1.组件使用: 之前微信小程序的富文本渲染组件用的wxParse,对普通富文本确实可以,但是对于代码格式pre标签则无法使用. 下面这个html2wxml很不错,可以支持代码高亮. 详细文档:http ...

  6. 树莓派3中编译Opencv3.4.10

    一.命令 -dev libv4l-dev libavcodec-dev libavformat-dev libswscale-dev cd wget http://sourceforge.net/pr ...

  7. vue中使用some删除list中的数据

    在vue中可以使用some方法查找需要删除的所以 this.list.some((item, i) => { if (item.id == id) { this.list.splice(i, 1 ...

  8. 【MySQL】玩转触发器、监听器

    1.触发器是一个特殊的存储过程,不同的是存储过程要用CALL来调用,而触发器不需要使用CALL. 创建触发器 语法如下: CREATE TRIGGER trigger_name trigger_tim ...

  9. Uber使用Swift重写APP的踩坑经历及解决方案(转载)

    本文出自Uber移动架构和框架组负责人托马斯·阿特曼于2016年在湾区Swift峰会上的演讲,分享了使用Swfit重写Uber的好与坏.以下为译文: 我是托马斯·阿特曼,目前是Uber移动架构和框架组 ...

  10. MySQL -- 异步I/O

    linux上,innodb使用异步IO子系统(native AIO)来对数据文件页进行预读和写请求.行为受到参数innodb_use_native_aio控制.默认是开启的,且只是适用于linux平台 ...