• Mysql库https://github.com/go-sql-driver/mysql
  • Go本身不提供具体数据库驱动,只提供驱动接口和管理。
  • 各个数据库驱动需要第三方实现,并且注册到Go中的驱动管理中。

安装golang mysql drvier

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

代码中需要注册mysql数据库驱动,通过引入空白导入mysql包来完成。

为什么需要使用空白导入?是因为需要执行mysql包的初始化代码(代码位于%GOPATH%/github.com/go-sql-driver/mysql/driver.go)

连接数据的DSN格式

username:password@protocol(address)/dbname?param=value

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

预处理的流程: step1. 将sql分为2部分.命令部分和数据部分. step2. 首先将命令部分发送给mysql服务器,mysql进行预处理.(如生成AST) step3. 然后将数据部分发送给mysql服务器,mysql进行占位符替换. step4. mysql服务器执行sql语句,把执行结果发送给客户端.

预处理的优势: 1.因为发送命令后,在mysql服务器端,就会将AST生成好,所以不需要对每一次值的更换都重新生成一次AST.对同样的数据不同的SQL来讲,只需生成1次AST,并缓存起来即可. 2.避免SQL注入.因为mysql知道再次发送过来的内容为”数据”,因此不会将这些数据解析为SQL,避免了SQL注入.

需要注意的点: 使用预处理进行查询操作时,不仅在defer时需要关闭结果集,而且还要关闭命令句柄,否则同样会占用连接,导致阻塞.

Mysql创建表:

  CREATE TABLE user (

  id int(20) NOT NULL AUTO_INCREMENT,

  name varchar(20) DEFAULT '',

  age int(2) DEFAULT '0',

  PRIMARY KEY (id))

  ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

数据库增删改查

insert

delete

update

query

事务支持

事务(transaction)

  • transaction, err := Db.Begin() 开启事务
  • transaction.Exec() 执行事务
  • transaction.Commit() 提交事务
  • transaction.Rollback() 回滚事务

A. 事务的应用场景   1. 同时更新多个表   2. 同时更新多行数据 B. 事务的ACID   1. 原子性   2. 一致性   3. 隔离性   4. 持久性

需要注意的点: 1. 执行失败要回滚 2. 提交失败要回滚

Mysql日期时间类型报错

原因是在调用sql.Open()时没有将parseTime设置为True。加入parseTime即可修复问题: