Go语言操作MySQL数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。

Go语言MySQL包
使用第三方开源的mysql库: github.com/go-sql-driver/mysql (MySQL驱动)
github.com/jmoiron/sqlx (基于MySQL驱动的封装) 通过如下命令,保存下载第三方库:
go get github.com/go-sql-driver/mysql
go get github.com/jmoiron/sqlx 创建数据库、数据表
在MySQL下创建 oldboy库:
mysql> CREATE DATABASE IF NOT EXISTS oldboy DEFAULT CHARSET utf8 COLLATE utf8_general_ci; 在oldboy库中创建student表。
mysql> use oldboy; mysql> CREATE TABLE IF NOT EXISTS `student`(
`id` int() unsigned NOT NULL AUTO_INCREMENT,
`name` varchar() NOT NULL,
`sex` varchar() NOT NULL,
`age` int() DEFAULT NULL,
`course` varchar() NOT NULL,
PRIMARY KEY (`id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8; MySQL连接池
数据库连接使用datebase/sql Open函数进行连接,用户应该通过db.Ping()函数来检查数据库是否实际可用。 package main import (
"fmt" _ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
) func main() {
//DB, err := sqlx.Open("数据库类型", "用户名:密码@tcp(地址:端口)/数据库名")
DB, err := sqlx.Open("mysql", "root:root@tcp(127.0.0.1:3306)/oldboy")
if err != nil {
fmt.Println("Open mysql failed,", err)
}
err = DB.Ping()
if err != nil {
fmt.Println("Ping mysql failed,", err)
} else {
fmt.Println("MySQL client success")
}
} 连接池配置
配置连接池有两个的函数:
设置最大数据库连接:使用 db.SetMaxOpenConns(n int) 函数设置打开数据库的最大连接数。包含正在使用的连接和连接池的连接。如果你的函数调用需要申请一个连接,并且连接池已经没有了连接或者连接数达到了最大连接数。此时的函数调用将会被block,直到有可用的连接才会返回。设置这个值可以避免并发太高导致连接mysql出现too many connections的错误。该函数的默认设置是0,表示无限制。
设置最大空闲连接:使用db.SetMaxIdleConns(n int) 函数设置连接池中的保持连接的最大连接数。默认也是0,表示连接池不会保持释放会连接池中的连接的连接状态:即当连接释放回到连接池的时候,连接将会被关闭。这会导致连接再连接池中频繁的关闭和创建。 插入操作
建议使用结构化操作,不推荐使用直接拼接sql语句的方法。
package main import (
"fmt" _ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
) type Student struct {
Id int `db:"id"`
Name string `db:"name"`
Sex string `db:"sex"`
Age int `db:"age"`
Course string `db:"course"`
} var Db *sqlx.DB func init() {
database, err := sqlx.Open("mysql", "root:root@tcp(127.0.0.1:3306)/oldboy")
if err != nil {
fmt.Println("open mysql failed,", err)
return
}
Db = database
} func main() {
r, err := Db.Exec("insert into student(name, sex, age, course)values(?, ?, ?, ?)", "张三", "男", , "Golang")
if err != nil {
fmt.Println("exec failed, ", err)
return
}
id, err := r.LastInsertId()
if err != nil {
fmt.Println("exec failed, ", err)
return
} fmt.Println("insert succ:", id)
} 查询操作
package main import (
"fmt" _ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
) type Student struct {
Id int `db:"id"`
Name string `db:"name"`
Sex string `db:"sex"`
Age int `db:"age"`
Course string `db:"course"`
} var Db *sqlx.DB func init() {
database, err := sqlx.Open("mysql", "root:root@tcp(127.0.0.1:3306)/oldboy")
if err != nil {
fmt.Println("open mysql failed,", err)
return
}
Db = database
} func main() {
var student []Student
err := Db.Select(&student, "select id, name, sex, age, course from student where course=?", "Golang")
if err != nil {
fmt.Println("exec failed, ", err)
return
} fmt.Println("select succ:", student)
} 修改操作
package main import (
"fmt" _ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
) type Student struct {
Id int `db:"id"`
Name string `db:"name"`
Sex string `db:"sex"`
Age int `db:"age"`
Course string `db:"course"`
} var Db *sqlx.DB func init() {
database, err := sqlx.Open("mysql", "root:root@tcp(127.0.0.1:3306)/oldboy")
if err != nil {
fmt.Println("open mysql failed,", err)
return
}
Db = database
} func main() {
res, err := Db.Exec("update student set name=? where course=?", "李四", "Golang")
if err != nil {
fmt.Println("exec failed, ", err)
return
}
row, err := res.RowsAffected()
if err != nil {
fmt.Println("rows failed, ", err)
}
fmt.Println("update succ:", row)
} 删除操作
package main import (
"fmt" _ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
) type Student struct {
Id int `db:"id"`
Name string `db:"name"`
Sex string `db:"sex"`
Age int `db:"age"`
Course string `db:"course"`
} var Db *sqlx.DB func init() {
database, err := sqlx.Open("mysql", "root:root@tcp(127.0.0.1:3306)/oldboy")
if err != nil {
fmt.Println("open mysql failed,", err)
return
}
Db = database
} func main() {
res, err := Db.Exec("delete from student where name=?", "李四")
if err != nil {
fmt.Println("exec failed, ", err)
return
} row, err := res.RowsAffected()
if err != nil {
fmt.Println("rows failed, ", err)
} fmt.Println("delete succ: ", row)
}
修改和删除操作都比较简单,同插入数据类似,只是使用RowsAffected来获取影响的数据行数。 MySQL事务
MySQL 事务主要用于处理操作量大,复杂度高的数据。
在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
事务用来管理 insert,update,delete 语句
一般来说,事务是必须满足4个条件(ACID):原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。 Go语言MySQL事务应用包与函数:
) import ("github.com/jmoiron/sqlx")
) conn, err := Db.Begin() 开始事务
) conn.Commit() 提交事务
) conn.Rollback() 回滚事务 事务应用
package main import (
"fmt" _ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
) type Student struct {
Id int `db:"id"`
Name string `db:"name"`
Sex string `db:"sex"`
Age int `db:"age"`
Course string `db:"course"`
} var Db *sqlx.DB func init() {
database, err := sqlx.Open("mysql", "root:root@tcp(127.0.0.1:3306)/oldboy")
if err != nil {
fmt.Println("open mysql failed,", err)
return
}
Db = database
} func main() {
conn, err := Db.Begin()
if err != nil {
fmt.Println("begin failed :", err)
return
} r, err := Db.Exec("insert into student(name, sex, age, course)values(?, ?, ?, ?)", "王五", "男", , "Golang")
if err != nil {
fmt.Println("exec failed, ", err)
conn.Rollback()
return
}
id, err := r.LastInsertId()
if err != nil {
fmt.Println("exec failed, ", err)
conn.Rollback()
return
}
fmt.Println("insert succ:", id) r, err = Db.Exec("insert into student(name, sex, age, course)values(?, ?, ?, ?)", "赵六", "男", , "Linux、Python、Java")
if err != nil {
fmt.Println("exec failed, ", err)
conn.Rollback()
return
}
id, err = r.LastInsertId()
if err != nil {
fmt.Println("exec failed, ", err)
conn.Rollback()
return
}
fmt.Println("insert succ:", id) conn.Commit()
} 查看MySQL:
mysql> select id,name,sex,age,course from student;
+----+--------+-----+------+-----------------------+
| id | name | sex | age | course |
+----+--------+-----+------+-----------------------+
| | 王五 | 男 | | Golang |
| | 赵六 | 男 | | Linux、Python、Java |
+----+--------+-----+------+-----------------------+
rows in set (0.00 sec) Go语言操作mysql除使用 github.com/go-sql-driver/mysql第三方开源的mysql库外还可以使用github.com/jinzhu/gorm包,GORM是使用Go语言开发的友好的ORM库。 安装
go get -u github.com/jinzhu/gorm 通用数据库接口sql.DB
从*gorm.DB连接获取通用数据库接口*sql.DB // 获取通用数据库对象`*sql.DB`以使用其函数
db.DB() // Ping
db.DB().Ping() 连接池
db.DB().SetMaxIdleConns()
db.DB().SetMaxOpenConns() 复合主键
将多个字段设置为主键以启用复合主键 type Product struct {
ID string `gorm:"primary_key"`
LanguageCode string `gorm:"primary_key"`
} 日志
Gorm有内置的日志记录器支持,默认情况下,它会打印发生的错误 // 启用Logger,显示详细日志
db.LogMode(true) // 禁用日志记录器,不显示任何日志
db.LogMode(false) // 调试单个操作,显示此操作的详细日志
db.Debug().Where("name = ?", "jinzhu").First(&User{}) 自定义日志
参考GORM的默认记录器如何自定义
https://github.com/jinzhu/gorm/blob/master/logger.go db.SetLogger(gorm.Logger{revel.TRACE})
db.SetLogger(log.New(os.Stdout, "\r\n", )) 架构
Gorm使用可链接的API,*gorm.DB是链的桥梁,对于每个链API,它将创建一个新的关系。
db, err := gorm.Open("postgres", "user=gorm dbname=gorm sslmode=disable") // 创建新关系
db = db.Where("name = ?", "jinzhu") // 过滤更多
if SomeCondition {
db = db.Where("age = ?", )
} else {
db = db.Where("age = ?", )
}
if YetAnotherCondition {
db = db.Where("active = ?", )
}
当我们开始执行任何操作时,GORM将基于当前的*gorm.DB创建一个新的*gorm.Scope实例 // 执行查询操作
db.First(&user)
并且基于当前操作的类型,它将调用注册的creating,updating,querying,deleting或row_querying回调来运行操作。

Go语言操作MySQL数据库的更多相关文章

  1. 使用Go语言操作MySQL数据库的思路与步骤

    最近在做注册登录服务时,学习用Go语言操作MySQL数据库实现用户数据的增删改查,现将个人学习心得总结如下,另外附有代码仓库地址,欢迎各位有兴趣的fork. 软件环境:Goland.Navicat f ...

  2. c语言操作mysql数据库

    c语言操作Mysql数据库,主要就是为了实现对数据库的增.删.改.查等操作,操作之前,得先连接数据库啊,而连接数据库主要有两种方法.一.使用mysql本身提供的API,在mysql的安装目录中可可以看 ...

  3. 用C语言操作MySQL数据库,进行连接、插入、修改、删除等操作

    C/C++ code   ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 3 ...

  4. golang学习之旅:使用go语言操作mysql数据库

    1.下载并导入数据库驱动包 官方不提供实现,先下载第三方的实现,点击这里查看各种各样的实现版本.这里选择了Go-MySQL-Driver这个实现.地址是:https://github.com/go-s ...

  5. Linux下C语言操作MySQL数据库

    MySQL是Linux系统下广泛使用的开源免费数据库,是Linux应用程序数据存储的首选. Ubuntu下安装 […]

  6. 在Myeclipse中用Java语言操作mysql数据库

    package OperateMysql; import java.sql.*; public class MysqlTest { public static void main(String[] a ...

  7. Linux C语言操作MySQL

    原文:Linux C语言操作MySQL 1.MySQL数据库简介 MySQL是一个开源码的小型关系数据库管理系统,体积小,速度快,总体成本低,开源.MySQL有以下特性: (1) 使用C和C++编写, ...

  8. python接口自动化(三十八)-python操作mysql数据库(详解)

    简介 现在的招聘要求对QA人员的要求越来越高,测试的一些基础知识就不必说了,来说测试知识以外的,会不会一门或者多门开发与语言,能不能读懂代码,会不会Linux,会不会搭建测试系统,会不会常用的数据库, ...

  9. C语言对mysql数据库的操作

    原文:C语言对mysql数据库的操作 这已经是一相当老的话题.不过今天我才首次使用,把今天的一些体会写下来,也许能给一些新手带来一定的帮助,更重要的是供自己今后忘记的怎么使用而进行查阅的! 我们言归正 ...

随机推荐

  1. iOS原生 和 react native视图混编

    在iOS原生功能中加入RN,请看之前 写的 RN与iOS交互系列文章.本篇只讲下视图混编. 关键点只有二: 1.通过 RCTRootView 加载RN视图. 2.RN中,只需要AppRegistry. ...

  2. ios12更新开发者需要做的

    1.StatusBar内部结构改变 现象:crash crash log: -[_UIStatusBarIdentifier isEqualToString:]: unrecognized selec ...

  3. ASP.NET Web API相关

    接收移动端上传的图片,示例代码: [HttpPost] [ApiSecurityFilter] public IHttpActionResult UploadImg() { string imgs = ...

  4. 台达VFD-B变频器调试

    一.变频器上电调试 变频器安装完成后,断开变频器的输出,在没通电前先使用数字表的二极管档对变频器的输入输出进行测量,确保无短路情况,然后接通变频器工作电源,(注意变频器标定的工作电源电压与外部输入电压 ...

  5. java-jdk动态代理生成的代理类源码

    import com.zkn.newlearn.gof.proxyhandler.PersonInter; import java.lang.reflect.InvocationHandler; im ...

  6. 17python-BS编程

    1.前端概述(1)上网:就是下载网页(2)浏览器:就是一个解释器2.BS模式的了解(1)BS模式:-----b:browser(浏览器)   s:server(服务端)(2)BS模式运行过程:brow ...

  7. linux磁盘分区笔记

    磁盘基本概念: 硬盘结构:盘片+磁头(盘片可以有多个),工作时盘片高速运转,磁头读取数据 U盘.SSD固态硬盘是用闪存来制作的设备,没有盘片和磁头 Linux磁盘文件名: Linux所有设备都抽象为文 ...

  8. 软件开发者路线图梗概&书摘chapter3

    漫漫长路:自定路线,想象十年后 1.技重于艺:重视客户的交付价值 客户的解决方案与个人内在标准的平衡 2.持续动力:金钱.乐趣.名声 列出五项最重要的动力 3.培养激情:博客.钻研名著.加入学习小组. ...

  9. 移除元素-leetcode-27

    class Solution {public:    int removeElement(vector<int>& nums, int val) {        if(nums. ...

  10. C# 关于变量使用范围容易犯错的问题(TreeView数据绑定为例)

    asp.net做一个treeview数据绑定 绑定子节点时查询出来的数据正确,但在进行数据绑定时一直索引溢出 然后调试 ... 调试 ... 再调试... 依然很崩溃  想到了是变量定义后面共用后的问 ...