下载安装,执行下面两个命令:

  • 下载:go get github.com/Go-SQL-Driver/MySQL
  • 安装:go install github.com/Go-SQL-Driver/MySQL

准备

建立数据库school和四张表并插入一些数据

--学生表
CREATE TABLE `Student`(`s_id` VARCHAR(20),`s_name` VARCHAR(20) NOT NULL DEFAULT '',`s_birth` VARCHAR(20) NOT NULL DEFAULT '',`s_sex` VARCHAR(10) NOT NULL DEFAULT '',PRIMARY KEY(`s_id`)
);
--课程表
CREATE TABLE `Course`(`c_id`  VARCHAR(20),`c_name` VARCHAR(20) NOT NULL DEFAULT '',`t_id` VARCHAR(20) NOT NULL,PRIMARY KEY(`c_id`)
);
--教师表
CREATE TABLE `Teacher`(`t_id` VARCHAR(20),`t_name` VARCHAR(20) NOT NULL DEFAULT '',PRIMARY KEY(`t_id`)
);
--成绩表
CREATE TABLE `Score`(`s_id` VARCHAR(20),`c_id`  VARCHAR(20),`s_score` INT(3),PRIMARY KEY(`s_id`,`c_id`)
); 

登录mysql

import ("database/sql"_"github.com/Go-SQL-Driver/MySQL")

func main() {
//open函数仅仅填入参数,不马上建立连接。后面query和exec时建立连接db, err := sql.Open("mysql","user:password@tcp(127.0.0.1:3306)/school")  //登录到数据库school中if err != nil {log.Fatal(err)}defer db.Close()  //避免频繁连接断开
}

可以进一步测试是否连接成功

err = db.Ping()
if err != nil {// do something here
}

查询

方式一、直接查询 (优先用这个方法)

        var  id, name stringrows, err := db.Query("select s_id, s_name from student where s_sex = ?", "男")if err != nil{  //如果结果为0行,不会返回错误if driverErr, ok := err.(*mysql.MySQLError); ok { if driverErr.Number == 1045 {  //访问被拒绝... }if...}}defer rows.Close()for rows.Next() {  //next需要与scan配合完成读取,取第一行也要先nexterr := rows.Scan(&id, &name)if err != nil {  //每一次迭代检查错误是必要的log.Fatal(err)}log.Println(id, name)}err = rows.Err()  //返回迭代过程中出现的错误if err != nil {log.Fatal(err)}

方式二、预备陈述(mysql高并发工作时,此方法会产生过多连接出现性能问题)

此方法方便复用陈述句,且根据不同需要填入参数值

        stmt, err := db.Prepare("select s_id, s_name from student where s_sex = ?")if err != nil {log.Fatal(err)}defer stmt.Close()rows, err := stmt.Query("男")if err != nil {log.Fatal(err)}defer rows.Close()for rows.Next() {.......}

方式三、只选取一行时

//方法一、直接读取var name stringerr = db.QueryRow("select s_name from student where s_id = ?", "01").Scan(&name)if err != nil {if err == sql.ErrNoRows {  //如果未查询到对应字段则......  } else {log.Fatal(err)}}fmt.Println(name)//方法二、预备陈述stmt, err := db.Prepare("select s_name from student where s_id = ?")if err != nil {log.Fatal(err)}defer stmt.Close()var name stringerr = stmt.QueryRow("01").Scan(&name)if err != nil {...}fmt.Println(name)

修改(INSERTUPDATEDELETE

        stmt, err := db.Prepare("INSERT INTO teacher(t_id,t_name) VALUES(?,?)")if err != nil {log.Fatal(err)}res, err := stmt.Exec("04","孔子") //mysql中的NULL类型,可用nil赋值if err != nil {log.Fatal(err)}lastId, err := res.LastInsertId()  //LastInsertId只在自增列时有效if err != nil {log.Fatal(err)}rowCnt, err := res.RowsAffected()if err != nil {log.Fatal(err)}log.Printf("ID = %d, affected = %d\n", lastId, rowCnt)

事务

同一个事务中只产生一个连接,预备陈述在高并发时不会有性能问题

        tx, err := db.Begin()  //开始事务if err != nil {log.Fatal(err)}defer tx.Rollback()  //发生异常事务回滚stmt, err := db.Prepare("INSERT INTO teacher(t_id,t_name) VALUES(?,?)")if err != nil {log.Fatal(err)}defer stmt.Close()_, err = stmt.Exec("05","老子")if err != nil {log.Fatal(err)}_, err = stmt.Exec("06","墨子")if err != nil {log.Fatal(err)}err = tx.Commit()  //事务确认if err != nil {log.Fatal(err)}

Nullable类型

方法一、对于可为空的字段可以,如下处理

for rows.Next() {var s sql.NullStringerr := rows.Scan(&s)// check errif s.Valid {fmt.Println(s.String)} else {fmt.Println("NULL")}
}

方法二、使用SQL中的函数COALESCE()

 rows, err := db.Query(`SELECT s_id, COALESCE(s_name, '') FROM STUDENT WHERE s_id = ?`, "01")
//如果选到s_id="01"时s_name为NULL时,s_name的取值返回空字符串

处理未知字段数和字段类型

rows, err := db.Query(`SELECT s_id, s_score FROM score WHERE s_id = ?`, "01")cols, err := rows.Columns() // Remember to check err afterwardsvals := make([]interface{}, len(cols))for i := range cols {vals[i] = new(sql.RawBytes)}for rows.Next() {err = rows.Scan(vals...)for _,i := range vals{s := string(*i.(*sql.RawBytes))fmt.Printf("%s ",s)}fmt.Println()}

连接池

func (db *DB) SetMaxOpenConns(n int) 

如果n不设置默认为0,小于等于0表示没有限制,如果新设的maxopenconns小于maxidleconns,那么后者会减小以符合前者的值

func (db *DB) SetMaxIdleConns(n int)

如果n不设置默认为2,小于等于0表示不留闲置连接,如果新设的maxidleconns大于maxopenconns,那么前者会减小以符合后者的值

func (db *DB) SetConnMaxLifetime(d time.Duration)

d小于等于0表示连接一直可复用

//每次完整的查询及取值后都需要close
db.SetMaxOpenConns(1)
rows, err := db.Query(`SELECT s_id, s_score FROM score WHERE s_id = ? `, "01")
do something...
//rows.Close()  //第一次查询如果没有close,由于最大连接数是1,下面查询时会发生阻塞rows, err = db.Query(`SELECT s_id, s_score FROM score WHERE s_id = ? `, "01")
do something...
rows.Close()//在rows.close之后连接断开,无法再使用rows.Columns()、rows.Next()等操作取值。
func (db *DB) Stats() DBStats 

返回连接池的状态

type DBStats struct {MaxOpenConnections int // Maximum number of open connections to the database.// Pool StatusOpenConnections int // The number of established connections both in use and idle.InUse           int // The number of connections currently in use.Idle            int // The number of idle connections.// CountersWaitCount         int64         // The total number of connections waited for.WaitDuration      time.Duration // The total time blocked waiting for a new connection.MaxIdleClosed     int64         // The total number of connections closed due to SetMaxIdleConns.MaxLifetimeClosed int64         // The total number of connections closed due to SetConnMaxLifetime.
}

其他测试代码

package mainimport (//"fmt""database/sql"_"github.com/Go-SQL-Driver/MySQL")type userinfo struct {username    stringdepartname  stringcreated     string
}func main(){db, err := sql.Open("mysql", "root:111111@tcp(127.0.0.1:3306)/test?charset=utf8")checkErr(err)//insert//stmt, err := db.Prepare("INSERT userinfo SET username=?,departname=?,created=?")//checkErr(err)//res, err := stmt.Exec("zhja", "研发", "2016-06-17")//checkErr(err)//id, err := res.LastInsertId()//checkErr(err)//fmt.Println(id) //result, err := db.Exec("INSERT INTO userinfo (username, departname, created) VALUES (?, ?, ?)","lily","销售","2016-06-21")//checkErr(err)//ids, err := result.LastInsertId()//fmt.Println(ids)//db.Exec("DELETE FROM userinfo WHERE uid=?", 1)//checkErr(err)//stmt, err := db.Prepare("DELETE FROM userinfo WHERE uid=?")//stmt.Exec(2)//var username, departname, created string//err = db.QueryRow("SELECT username,departname,created FROM userinfo WHERE uid=?", 3).Scan(&username, &departname, &created)//fmt.Println(username)//fmt.Println(departname)//fmt.Println(created)rows, err := db.Query("SELECT username,departname,created FROM userinfo WHERE username=?", "zhja")checkErr(err)for rows.Next() {var username, departname, created stringif err := rows.Scan(&username, &departname, &created); err == nil {fmt.Println(err)}fmt.Println(username)fmt.Println(departname)fmt.Println(created)}tx, err := db.Begin()checkErr(err)stmt, err1 := tx.Prepare("INSERT INTO userinfo (username, departname, created) VALUES (?, ?, ?)")checkErr(err1)_, err2 := stmt.Exec("test", "测试", "2016-06-20")checkErr(err2)//err3 := tx.Commit()err3 := tx.Rollback()checkErr(err3)}func checkErr(err error){if err != nil {panic(err)}
}

golang操作mysql数据库(Go-SQL-Driver/MySQL)相关推荐

  1. mysql数据库导入sql文件Mysql导入导出.sql文件的方法

    mysql数据库导入sql文件:Mysql导入导出.sql文件的方法 mysql导入sql文件:Mysql导入导出.sql文件 步骤如下: 一.MYSQL的命令行模式的设置: 桌面->我的电脑- ...

  2. MySQL数据库:SQL语句

    MySql数据库系列阅读 MySQL数据库 MySQL数据库:SQL语句 MySQL数据库:完整性约束 MySQL数据库备份与还原 MySQL数据库:编码 1. SQL概述 1.1 什么是SQL SQ ...

  3. MySQL数据库的SQL语句

    MySQL数据库的SQL语句 MySQL的常用数据类型 MySQL数据类型及含义 char与varchar的区别 MySQL的基本命令 登录数据库 查看MySQL数据库版本 查看当前服务器中的数据库 ...

  4. MySQL数据库之SQL的各种操作/Html/Java和XML的关系

    MySQL数据库之SQL的各种操作/Html/Java和XML的关系 今天内容:(1)数据库的概述(2)MySQL数据库的环境搭建(3)常用的数据类型(4)DDL数据定义语句(5)DML数据操纵语句1 ...

  5. MySQL中删除数据库的基本语法格式为_《MySQL数据库》SQL简介、语法格式

    原标题:<MySQL数据库>SQL简介.语法格式 一.SQL的简介 结构化查询语言(Structured Query Language),简称SQL.它是专门用来访问数据库的标准编程语言. ...

  6. 1.MySQL数据库 2.SQL语句

    01数据库概念 * A: 什么是数据库数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作. * B: 什么是数据库 ...

  7. 视频教程-19全新mysql教程零基础入门实战精讲mysql视频DBA数据库视频教程SQL教程-MySQL

    19全新mysql教程零基础入门实战精讲mysql视频DBA数据库视频教程SQL教程 7年的开发架构经验,曾就职于国内一线互联网公司,开发工程师,现在是某创业公司技术负责人, 擅长语言有node/ja ...

  8. Mysql数据库以及sql语言

    mysql 安装请点击 mysql下载速度慢请点击 可视化工具请点击(不想用命令行的) mysql和java集成:jdbc mysql 索引的创建以及含义 mysql一般函数的使用(需要一定的sql基 ...

  9. mysql 结构化数据库_【MySQL】——MySQL数据库和SQL结构化查询语言概述

    [MySQL]--MySQL数据库和SQL结构化查询语言概述 [MySQL]--MySQL数据库和SQL结构化查询语言概述 文章目录数据库和SQL语言[1]数据库概述 [2]SQL语言 [3]MySQ ...

  10. MySQL数据库高级SQL语句(三)

    MySQL数据库高级SQL语句 SELECT TRIM 连接查询 CREATE VIEW UNION 交集值 无交集值 CASE SELECT TRIM SELECT TRIM (位置 '想移除掉的字 ...

最新文章

  1. 什么是AWS Lambda?
  2. 什么叫侧面指纹识别_前面侧面还是背面?手机指纹识别放哪儿合适
  3. 重温《数据库系统概论》【第一篇 基础篇】【第1章 绪论】
  4. struts2 s:property/标签的使用--输出时间格式转换
  5. 关于我在(PTA)程序设计类实验辅助教学平台的重修经历
  6. Backlog Order
  7. 第一部分 移动终端芯片概述
  8. 信道容量受哪三个要素_连续信道容量将受到“三要素”的限制,其“三要素”是...
  9. 聚合物-化学键-聚合物PEG-Hyd-PDLLA /PLA-PHis-hyd-PEG/PEG-PUSeSe-PEG
  10. DNS记录类型介绍(A记录、MX记录、NS记录等)
  11. AI 作画:Stable Diffusion 模型原理与实践
  12. android sd卡获取不到,解决Android10读取不到/sdcard/、/storage/emulated/0/文件的问题
  13. 国际清算银行成员发布央行数字货币分析报告
  14. linux win95模拟,Windows 95模拟器
  15. java web论文_(定稿)毕业论文基于JavaWeb技术博客项目的设计论文(完整版)最新版...
  16. python随机森林变量重要性_推荐 :一文读懂随机森林的解释和实现(附python代码)...
  17. 控制chrome中PDF预览工具栏
  18. 【历史上的今天】2 月 15 日:Pascal 之父出生;YouTube 成立;Kotlin 语言问世
  19. mysql 取年月_MySQL 获取指定时间段的年月
  20. idedvicesyslog ERROR: Could not start service com.apple.syslog_relay.

热门文章

  1. 当我们谈论生信的时候我们在谈什么
  2. 遗传所屠强研究组开发Decode-seq方法显著提高差异表达基因分析的准确性
  3. Animation Studio插件怎么用?Nitrozme Animation Studio Packages Mac(AE插件拓展包) 安装教程
  4. 1.5 编程基础之循环控制 33 计算分数加减表达式的值 python
  5. 1.5编程基础之循环控制_45金币
  6. mat分析dump分析_MAT从入门到精通(一)
  7. 数字系统设计学习之QuartusII9的安装
  8. scsi协议_存储协议有哪些类型?常见存储协议分析
  9. input输入框禁止自动补全和下拉提示
  10. C++ STL vector的容量