导入数据库驱动

import ("database/sql""fmt"_ "github.com/go-sql-driver/mysql""time"
)

mysql连接配置

const (USERNAME = "root"PASSWORD = "*******"NETWORK  = "tcp"SERVER   = "localhost"PORT     = 3306DATABASE = "blog"
)

建立连接

    dsn := fmt.Sprintf("%s:%s@%s(%s:%d)/%s",USERNAME,PASSWORD,NETWORK,SERVER,PORT,DATABASE)DB,err := sql.Open("mysql",dsn)if err != nil{fmt.Printf("Open mysql failed,err:%v\n",err)return}DB.SetConnMaxLifetime(100*time.Second)  //最大连接周期,超过时间的连接就closeDB.SetMaxOpenConns(100)//设置最大连接数DB.SetMaxIdleConns(16) //设置闲置连接数

数据模型

type User struct {ID int64 `db:"id"`Name sql.NullString  `db:"name"`  //由于在mysql的users表中name没有设置为NOT NULL,所以name可能为null,在查询过程中会返回nil,如果是string类型则无法接收nil,但sql.NullString则可以接收nil值Age int `db:"age"`
}

数据表结构

查询单行

func queryOne(DB *sql.DB){fmt.Println("query times:",i)user := new(User)row := DB.QueryRow("select * from users where id=?",1)//row.scan中的字段必须是按照数据库存入字段的顺序,否则报错if err :=row.Scan(&user.ID,&user.Name,&user.Age); err != nil{fmt.Printf("scan failed, err:%v",err)return}fmt.Println(*user)}
}

注意:
row必须scan,不然会导致连接无法关闭,会一直占用连接,直到超过设置的生命周期
下面是未scan导致连接被占用的,最大连接数为100

func queryOne(DB *sql.DB){for i:=0;i< 150;i++ {fmt.Println("query times:",i)user := new(User)row := DB.QueryRow("select * from users where id=?",1)continueif err :=row.Scan(&user.ID,&user.Name,&user.Age); err != nil{fmt.Printf("scan failed, err:%v",err)return}fmt.Println(*user)}
}

执行结果:

在执行到100后会发生阻塞,等待连接池释放。

查询多行

func queryMulti(DB *sql.DB){user := new(User)rows, err := DB.Query("select * from users where id > ?", 1)defer func() {if rows != nil {rows.Close() //可以关闭掉未scan连接一直占用}}()if err != nil {fmt.Printf("Query failed,err:%v", err)return}for rows.Next() {err = rows.Scan(&user.ID, &user.Name, &user.Age) //不scan会导致连接不释放if err != nil {fmt.Printf("Scan failed,err:%v", err)return}fmt.Print(*user)}
}

插入数据

func insertData(DB *sql.DB){result,err := DB.Exec("insert INTO users(name,age) values(?,?)","YDZ",23)if err != nil{fmt.Printf("Insert failed,err:%v",err)return}lastInsertID,err := result.LastInsertId()  //插入数据的主键idif err != nil {fmt.Printf("Get lastInsertID failed,err:%v",err)return}fmt.Println("LastInsertID:",lastInsertID)rowsaffected,err := result.RowsAffected()  //影响行数if err != nil {fmt.Printf("Get RowsAffected failed,err:%v",err)return}fmt.Println("RowsAffected:",rowsaffected)
}

更新数据

func updateData(DB *sql.DB){result,err := DB.Exec("UPDATE users set age=? where id=?","30",3)if err != nil{fmt.Printf("Insert failed,err:%v",err)return}rowsaffected,err := result.RowsAffected()if err != nil {fmt.Printf("Get RowsAffected failed,err:%v",err)return}fmt.Println("RowsAffected:",rowsaffected)
}

注意:更新数据不返回LastInsertID,所以result.LastInsertID一直为0

删除数据

func deleteData(DB *sql.DB){result,err := DB.Exec("delete from users where id=?",1)if err != nil{fmt.Printf("Insert failed,err:%v",err)return}lastInsertID,err := result.LastInsertId()if err != nil {fmt.Printf("Get lastInsertID failed,err:%v",err)return}fmt.Println("LastInsertID:",lastInsertID)rowsaffected,err := result.RowsAffected()if err != nil {fmt.Printf("Get RowsAffected failed,err:%v",err)return}fmt.Println("RowsAffected:",rowsaffected)
}

注意:更新数据不返回LastInsertID,所以result.LastInsertID一直为0

最终代码

/**
*FileName: mysql
*Create on 2018/7/17 下午4:57
*Create by mok
*golang中mysql的用法*/package mainimport ("database/sql""fmt"_ "github.com/go-sql-driver/mysql""time"
)type User struct {ID   int64          `db:"id"`Name sql.NullString `db:"name"`Age  int            `db:"age"`
}const (USERNAME = "root"PASSWORD = "chen19950210"NETWORK  = "tcp"SERVER   = "localhost"PORT     = 3306DATABASE = "blog"
)func main() {dsn := fmt.Sprintf("%s:%s@%s(%s:%d)/%s", USERNAME, PASSWORD, NETWORK, SERVER, PORT, DATABASE)DB, err := sql.Open("mysql", dsn)if err != nil {fmt.Printf("Open mysql failed,err:%v\n", err)return}DB.SetConnMaxLifetime(100 * time.Second)DB.SetMaxOpenConns(100)DB.SetMaxIdleConns(16)queryOne(DB)queryMulti(DB)insertData(DB)updateData(DB)deleteData(DB)
}//查询单行
func queryOne(DB *sql.DB) {user := new(User)row := DB.QueryRow("select * from users where id=?", 1)if err := row.Scan(&user.ID, &user.Name, &user.Age); err != nil {fmt.Printf("scan failed, err:%v", err)return}fmt.Println(*user)
}//查询多行
func queryMulti(DB *sql.DB) {user := new(User)rows, err := DB.Query("select * from users where id > ?", 1)defer func() {if rows != nil {rows.Close()}}()if err != nil {fmt.Printf("Query failed,err:%v", err)return}for rows.Next() {err = rows.Scan(&user.ID, &user.Name, &user.Age)if err != nil {fmt.Printf("Scan failed,err:%v", err)return}fmt.Print(*user)}}//插入数据
func insertData(DB *sql.DB){result,err := DB.Exec("insert INTO users(name,age) values(?,?)","YDZ",23)if err != nil{fmt.Printf("Insert failed,err:%v",err)return}lastInsertID,err := result.LastInsertId()if err != nil {fmt.Printf("Get lastInsertID failed,err:%v",err)return}fmt.Println("LastInsertID:",lastInsertID)rowsaffected,err := result.RowsAffected()if err != nil {fmt.Printf("Get RowsAffected failed,err:%v",err)return}fmt.Println("RowsAffected:",rowsaffected)
}//更新数据
func updateData(DB *sql.DB){result,err := DB.Exec("UPDATE users set age=? where id=?","30",3)if err != nil{fmt.Printf("Insert failed,err:%v",err)return}rowsaffected,err := result.RowsAffected()if err != nil {fmt.Printf("Get RowsAffected failed,err:%v",err)return}fmt.Println("RowsAffected:",rowsaffected)
}//删除数据
func deleteData(DB *sql.DB){result,err := DB.Exec("delete from users where id=?",1)if err != nil{fmt.Printf("Insert failed,err:%v",err)return}rowsaffected,err := result.RowsAffected()if err != nil {fmt.Printf("Get RowsAffected failed,err:%v",err)return}fmt.Println("RowsAffected:",rowsaffected)
}

golang mysql 基本操作相关推荐

  1. MySQL中定义fk语句_MySQL基础篇/第3篇:MySQL基本操作语句.md · qwqoo/MySQL-Review - Gitee.com...

    ### 第3篇:MySQL基本操作语句 - MySQL基础操作 #### 排序检索数据 - 之前的数据没有进行排序,其是按照默认在数据表中的数据返回的 - SELECT语句的ORDER BY 子句进行 ...

  2. 20分钟学会mysql_5分钟学会mysql基本操作

    mysql视频教程栏目介绍如何快速学会mysql基本操作 相关免费学习推荐:mysql视频教程 文章目录一.SQL是什么? 分类: 二.关于数据库CRUD操作 1.操作表list: 2.对表内数据进行 ...

  3. mysql键1键2_详解mysql基本操作详细(二)

    前言 本文类容 1.数据库的几大约束 2.表与表之间的关系 约束: 主键约束: 作用:为了保证数据的有效性和完整性 mysql中常用的约束:主键约束(primary key) 唯一约束(unique) ...

  4. linux mysql etc inid_Linux下mysql基本操作

    Linux下mysql基本操作 作者:浩浩哥来了 对mysql进行初始密码的添加 方法(一) mysqladmin -uroot password 123 方法(二) 如果在添加初始密码是报错了可以进 ...

  5. ci mysql操作_MySQL基础篇/第3篇:MySQL基本操作语句.md · icanci/MySQL-Review - Gitee.com...

    ### 第3篇:MySQL基本操作语句 - MySQL基础操作 #### 排序检索数据 - 之前的数据没有进行排序,其是按照默认在数据表中的数据返回的 - SELECT语句的ORDER BY 子句进行 ...

  6. MySQL基本操作,个人总结。(WampServer小补充)

    原文链接    https://blog.csdn.net/Edogawa_Konan/article/details/80259838 WampServer就是Windows Apache Mysq ...

  7. 【MySQL基础】MySQL基本操作详解

    系列文章目录 第1篇:[MySQL基础]MySQL介绍及安装 第2篇:[MySQL基础]MySQL基本操作详解 文章目录 ✍1,数据库操作     

  8. C++ Mysql基本操作

    C++ Mysql基本操作 连接Mysql MYSQL *mysql_init(MYSQL *mysql) 如果mysql是NULL指针,该函数将分配.初始化.并返回新对象.否则,将初始化对象,并返回 ...

  9. 史上最全MySQL基本操作(这一篇就够用了!!!)

    基础知识请移步:数据库.MySQL基本知识 欢迎学习交流!!! 持续更新中- 文章目录 MySQL基本操作 一.SQL语法规则 二.SQL库操作 1.创建数据库 2.显示数据库 3.使用数据库 4.修 ...

最新文章

  1. html靶心制作,用PS单色填充制作一个靶心
  2. 史上最全《知识图谱》2020综述论文!!!
  3. video自动全屏播放
  4. 使用枚举映射_用EnumMaps映射枚举键
  5. 【C++ Priemr | 15】派生类向基类转换的可访问性
  6. POJ - 3026(BFS+最小生成树.krustal)
  7. 股票市值管理什么意思?
  8. 源码分析三:OkHttp(2)—拦截器简介
  9. linux命令行看直播网站,快速搭建linux下视频点播,直播网站。
  10. Cesium屏幕坐标转世界坐标
  11. 将txt文件编码改为utf-8格式
  12. 清理电脑里的流氓软件/插件/弹窗
  13. 查看360极速浏览器已保存的星号密码明文
  14. 51cto mysql下载_安装Mysql服务_大神程序员养成之路-Mysql数据库基础_MySQL视频-51CTO学院...
  15. php rm-rf,rm-rf误操作的恢复过程
  16. 如何低成本减少企业知识流失?天翎知识文档系统+群晖NAS值得一试
  17. c语言中的字母占位符,C语言专题-基本数据类和占位符
  18. openstack创建的云主机不能访问外网,不能ping www.baidu.com
  19. 在磨金石教育学室内设计靠谱吗?学费贵吗?老师负责吗?
  20. Chartles功能介绍

热门文章

  1. NR 5G RRC无线资源控制
  2. NR 5G 安全要求和功能
  3. 使Mybatis开发变得更加轻松的增强工具 — Ourbatis
  4. 加密算法 AES MD5 SHA1
  5. 2017年嵌入式领域的MCU四个变化
  6. 有人买不?没人的话我待会儿再来问问 价值6.11亿美元的入侵工具无人问津
  7. Java 优先级的问题
  8. 通过DBA_SOURCE定位SQL语句属于哪个存储过程
  9. 数据丢失如当头棒喝,数据备份重如山!
  10. Centos 6 常用服务部署命令说明