之前,已经讲过一些Golang的基础的东西,感兴趣的可以看看以前的文章,https://www.cnblogs.com/zhangweizhong/category/1275863.html

今天简单介绍下Golang是如何使用mysql数据库的。由于Go本身不提供具体数据库驱动,只提供驱动接口和管理。各个数据库驱动需要第三方实现,并且注册到Go中的驱动管理中。github上面的mysql驱动有好几个,我在这里选择的https://github.com/go-sql-driver/mysql

下面主要从增删查改以及事物等方面介绍go语言中mysql的使用

一、连接数据库

使用sql.Open()函数打开数据库连接,数据库的连接字符串(dsn)格式如下:

admin:123456@tcp(10.2.1.5)/irisapp

代码如下:

func (f *mysql_db) mysql_open() {
db, err := sql.Open("mysql", dbusername+":"+dbpassword+"@tcp("+dbhostsip+")/"+dbname)
if err != nil {
fmt.Println("链接失败")
}
fmt.Println("链接成功")
f.db = db
}

二、插入

func (f *mysql_db) mysql_insert() { //insert  添加数据
fmt.Println("开始插入")
stmt, err := f.db.Prepare("INSERT INTO depart(departName,memo) VALUES(?,?)")
//defer stmt.Close()
if err != nil {
fmt.Println("插入失败")
return
}
stmt.Exec("dd", "adadcccda")
fmt.Println("插入成功")
}

三、查询

func (f *mysql_db) mysql_select(sql_data string) {   //select 查询数据
fmt.Println("sql:", sql_data)
rows, err := f.db.Query(sql_data)
if err != nil {
fmt.Println("查询失败")
}
for rows.Next() {
var departID int
var departName string
var memo string
err = rows.Scan(&departID, &departName, &memo)
if err != nil {
panic(err)
}
fmt.Println("departName:", departName)
} }

四、更新

func (f *mysql_db) mysql_update() { //update  修改数据
stmt, err := f.db.Prepare("update depart set departName=?,memo =? where departId=?")
//defer stmt.Close()
if err != nil {
//错误处理
}
result,_ := stmt.Exec("aa","asdfadsadsfa",)
if result == nil {
fmt.Println("修改失败")
}
affect_count,_ := result.RowsAffected() //返回影响的条数,注意有两个返回值
fmt.Println("%v",affect_count)
}

五、删除

func (f *mysql_db) mysql_delete() { //delete  删除数据
stmt, err := f.db.Prepare("delete from depart where departId=?")
//defer stmt.Close()
if err != nil {
//错误处理
}
stmt.Exec() //不返回任何结果
fmt.Println("删除成功")
}

六、事物

func (f *mysql_db) mysql_tran(){
//事务
tx,err := f.db.Begin() //声明一个事务的开始
if err != nil {
fmt.Println(err)
return
}
insert_sql := "insert into depart (departName,memo) VALUES(?,?)"
insert_stmt,insert_err := tx.Prepare(insert_sql)
if insert_err != nil {
fmt.Println(insert_err)
return
}
insert_res,insert_err := insert_stmt.Exec("ff","ff")
last_insert_id,_ := insert_res.LastInsertId()
fmt.Println(last_insert_id)
// defer tx.Rollback() //回滚之前上面的last_login_id是有的,但在回滚后该操作没有被提交,被回滚了,所以上面打印的Last_login_id的这条数据是不存在与数据库表中的
tx.Commit() //这里提交了上面的操作,所以上面的执行的sql 会在数据库中产生一条数据
}

调用

func main() {
db := &mysql_db{}
db.mysql_open()
db.mysql_insert()
db.mysql_update()
db.mysql_delete()
db.mysql_tran()
db.mysql_select("select departID,departName,memo from depart")
db.mysql_close() //关闭 }

启动后输出如下:

D:\Go_Path\go\src\mysqldemo>go run mysqldemo.go
链接成功
开始插入
插入成功 删除成功 sql: select departID,departName,memo from depart
departName: aa
departName: dd
departName: dd
departName: dd
departName: dd
departName: dd
departName: ff
departName: dd
departName: ff

完整代码

package main

import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
) var (
dbhostsip = "10.2.1.5:3306"
dbusername = "admin"
dbpassword = ""
dbname = "irisapp"
) type mysql_db struct {
db *sql.DB
} func (f *mysql_db) mysql_open() {
db, err := sql.Open("mysql", dbusername+":"+dbpassword+"@tcp("+dbhostsip+")/"+dbname)
if err != nil {
fmt.Println("链接失败")
}
fmt.Println("链接成功")
f.db = db
} func (f *mysql_db) mysql_close() {
defer f.db.Close()
} func (f *mysql_db) mysql_select(sql_data string) { //select 查询数据
fmt.Println("sql:", sql_data)
rows, err := f.db.Query(sql_data)
if err != nil {
fmt.Println("查询失败")
}
for rows.Next() {
var departID int
var departName string
var memo string
err = rows.Scan(&departID, &departName, &memo)
if err != nil {
panic(err)
}
fmt.Println("departName:", departName)
} } func (f *mysql_db) mysql_insert() { //insert 添加数据
fmt.Println("开始插入")
stmt, err := f.db.Prepare("INSERT INTO depart(departName,memo) VALUES(?,?)")
//defer stmt.Close()
if err != nil {
fmt.Println("插入失败")
return
}
stmt.Exec("dd", "adadcccda")
fmt.Println("插入成功")
} func (f *mysql_db) mysql_update() { //update 修改数据
stmt, err := f.db.Prepare("update depart set departName=?,memo =? where departId=?")
//defer stmt.Close()
if err != nil {
//错误处理
}
result,_ := stmt.Exec("aa","asdfadsadsfa",)
if result == nil {
fmt.Println("修改失败")
}
affect_count,_ := result.RowsAffected() //返回影响的条数,注意有两个返回值
fmt.Println(affect_count)
} func (f *mysql_db) mysql_delete() { //delete 删除数据
stmt, err := f.db.Prepare("delete from depart where departId=?")
//defer stmt.Close()
if err != nil {
//错误处理
}
stmt.Exec() //不返回任何结果
fmt.Println("删除成功")
} func (f *mysql_db) mysql_tran(){
//事务
tx,err := f.db.Begin() //声明一个事务的开始
if err != nil {
fmt.Println(err)
return
}
insert_sql := "insert into depart (departName,memo) VALUES(?,?)"
insert_stmt,insert_err := tx.Prepare(insert_sql)
if insert_err != nil {
fmt.Println(insert_err)
return
}
insert_res,insert_err := insert_stmt.Exec("ff","ff")
last_insert_id,_ := insert_res.LastInsertId()
fmt.Println(last_insert_id)
// defer tx.Rollback() //回滚之前上面的last_login_id是有的,但在回滚后该操作没有被提交,被回滚了,所以上面打印的Last_login_id的这条数据是不存在与数据库表中的
tx.Commit() //这里提交了上面的操作,所以上面的执行的sql 会在数据库中产生一条数据
} func main() {
db := &mysql_db{}
db.mysql_open()
db.mysql_insert()
db.mysql_update()
db.mysql_delete()
db.mysql_tran()
db.mysql_select("select departID,departName,memo from depart")
db.mysql_close() //关闭 }

总结

1. 支持预备表达式,可以用来优化SQL查询提高性能,减少SQL注入的风险, db.Prepare()和 tx.Prepare 都提供了对于预备表达式的支持。

2. LastInsertId()  获取插入第一条的id

3. RowsAffected()  获取影响/插入的条数

4. 这里只是简单介绍了go语言开发中mysql在go语言开发中的基本使用,其实真正开发过程中还是主要使用orm相关第三方框架,但是底层原理还是要学的。

Golang 入门系列(十) mysql数据库的使用的更多相关文章

  1. Golang 入门系列(十一)Go语言实现webapi

    之前,已经讲过很多Golang的东西,比如基础语法,mysql的使用,redis的使用等等,感兴趣的可以看看以前的文章,https://www.cnblogs.com/zhangweizhong/ca ...

  2. Golang原生sql操作Mysql数据库增删改查

    Golang要操作mysql数据库,首先需要在当期系统配置GOPATH,因为需要使用go get命令把驱动包下载到GOPATH下使用. 首先配置好你的GOPATH,执行以下命令,下载安装mysql驱动 ...

  3. Flask从入门到精通之MySQL数据库操作

    前面的章节中我们已经学习了如何建立模型和关系,接下来我们学习如何使用模型的最好方法是在Python shell 中实际操作.并将介绍最常用的数据库操作. 一.创建表 首先,我们要让Flask-SQLA ...

  4. Golang 入门系列(十二)ORM框架gorm

    之前在已经介绍了用的github.com/go-sql-driver/mysql 访问数据库,不太了解的可以看看之前的文章 https://www.cnblogs.com/zhangweizhong/ ...

  5. Golang 入门系列(十五)如何理解go的并发?

    前面已经讲过很多Golang系列知识,感兴趣的可以看看以前的文章,https://www.cnblogs.com/zhangweizhong/category/1275863.html, 接下来要说的 ...

  6. Golang 入门系列(十六)锁的使用场景主要涉及到哪些?读写锁为什么会比普通锁快

    前面已经讲过很多Golang系列知识,感兴趣的可以看看以前的文章,https://www.cnblogs.com/zhangweizhong/category/1275863.html, 接下来要说的 ...

  7. Golang 入门系列(十四)defer, panic和recover用法

    以前讲过golang 的基本语法.但是,只是讲了一些基础的语法,感兴趣的可以看看以前的文章,https://www.cnblogs.com/zhangweizhong/category/1275863 ...

  8. Golang 入门系列(十三)用Beego开发web应用

    接着之前的内容,前面已经讲过很多Golang的基础语法,mysql的使用,redis的使用,也讲了orm框架,如何创建一个webapi 服务等等,感兴趣的可以看看以前的文章,https://www.c ...

  9. 《面试经典系列》- MySQL数据库存储引擎

    一.MySQL有多少种存储引擎? 在MySQL5之后,支持的存储引擎有十多个,但是我们常用的就那么几种,而且,默认支持的也是 InnoDB. 通过命令:show engines \g,我们可以查看到当 ...

随机推荐

  1. 适配器模式 adapter 结构型 设计模式(九)

    现实世界中的适配器模型   先来看下来几个图片,截图自淘宝 上图为港版的插头与港版的插座   上图为插座适配器卖家的描述图   上图为适配后的结果 现实世界中适配器模式 角色分类 这就是适配器模式在电 ...

  2. 【测试工程师面试】 记录XX银行面试

    LZ在一个18线小城市做测试,近来想走出自己的舒适区,去做一点不一样的测试工作. 18线地区,测试工作并不多.最好的差不多就是LZ目前待着的公司了.遂决定去魔都闯荡几年,对一个在魔都无房无车无户口的人 ...

  3. 用meterpreter实现跳板机

      meterpreter跳板机 背景:渗透测试者A拿到了B主机的控制权,但没有拿到ssh密码(不能打ssh隧道).现需横向移动渗透内网主机C,为了避免动作过大不便直接在B上对C进行渗透,其中C不能出 ...

  4. MyBatis动态代理执行原理

    前言 大家使用MyBatis都知道,不管是单独使用还是和Spring集成,我们都是使用接口定义的方式声明数据库的增删改查方法.那么我们只声明一个接口,MyBatis是如何帮我们来实现SQL呢,对吗,我 ...

  5. ROS笔记2 构建一个package

    构建package catkin_make 可以理解为一个集成了CMake和make的命令行工具 通常的cmake构建如下 # In a CMake project $ mkdir build $ c ...

  6. JavaScript 循环语句

    while     while循环由两个代码块组成,分别是条件语句和循环体. while ( [条件] ) { [循环体] } while循环类似于if语句,不同的是while循环将不断地执行循环体直 ...

  7. 第六讲 smart qq C#开发总结

    smart qqC#开发总结: 整个开发下来其实一点都不是很难,从一开始二维码 获取到最终的收发消息,基本上都是模拟浏览器的操作.都是基于http通讯.一下就是 本次新手学习http协议的最关键的一个 ...

  8. PhpStorm 安装ApiDebugger

    ApiDebugger,是一个开源的接口调试IntelliJ IDEA插件,具有与IDEA一致的界面,无需切换程序即可完成网络API请求,让你的code更加沉浸式. 安装 File->Setti ...

  9. SAP MM 可以不用创建盘点凭证直接录入盘点结果?

    SAP MM 可以不用创建盘点凭证直接录入盘点结果? 可以.SAP标准功能就支持这么做. 事务代码 MI09 (Enter Count w/o Reference to Document), 输入pl ...

  10. IDEA工具教程

    刚从myeclipse工具转成IntelliJ IDEA工具,在“传智播客*黑马程序员”学习了相关操作和配置,因此整理在该文章中.   文章大纲 教程文档下载地址 链接:https://pan.bai ...