数据库连接与操作

golang mysql

Posted by yueLng on 2017-12-28

连接与连接池

database/sql是golang的标准库之一,它提供了一系列接口方法,用于访问关系数据库。

  • sql.DB类型代表了数据库,golang中的连接来自内部实现的连接池,连接的建立是惰性的,只有需要连接的时候,连接池才会帮你创建。
  • sql.Result表示结果集,sql.Rows表示查询返回多行数据的结果集,sql.Row表示单行结果集,对于插入更新和删除对应的结果集是sql.Result
  • sql.Statements,sql.Stmt表示sql查询语句,例如DDL、DML等类似的sql语句
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
func main() {
db, err := sql.Open("mysql", "root:@tcp(127.0.0.1:3306)/test?parseTime=true")
rs, err := db.Exec("INSERT INTO test.hello(world) VALUES ('hello world')")
if err != nil{
log.Fatalln(err)
}
rowCount, err := rs.RowsAffected()
if err != nil{
log.Fatalln(err)
}
rows, err := db.Query("SELECT world FROM test.hello")
if err != nil{
log.Fatalln(err)
}
for rows.Next(){
var s string
err = rows.Scan(&s)
if err !=nil{
log.Fatalln(err)
}
log.Printf("found row containing %q", s)
}
rows.Close()
}

连接池配置有两个方法

  • db.SetMaxOpenConns(n int) SetMaxOpenConns sets the maximum number of open connections to the database。包括正在使用的连接和连接池的连接,当函数调用需要申请一个连接,但连接池没有连接或者连接数达到最大连接数,则函数调用将会block,直到有可用的连接才返回。设置这个值可以避免并发太高导致mysql出现too many connection的错误,如果设置为0,则表示无限制。
  • db.SetMaxIdelConns(n int) SetMaxIdleConns sets the maximum number of connections in the idle connection pool.

Prepared机制

查询语句可以分为两种,一种是直接拼接好sql,另外一种是带有占位符的sql,第二个参数为sql的实际参数。在底层通信上不完全一样,一种是plaintext方式,另一种是prepared方式
prepared,带有占位符的sql语句,先将该语句和参数发给mysql服务器,mysql编译成一个prepared语句,这个语句可以根据不同参数多次调用,执行方式如下

  • 准备prepare语句
  • 执行prepared语句和参数
  • 关闭prepared语句

prepare语句可以避免通过拼装SQL带来SQL注入的风险,另外可以多次执行SQL语句

事务

database/sql提供了事务处理的功能。通过Tx对象实现。db.Begin会创建tx对象,后者的Exec和Query执行事务的数据库操作,最后在tx的Commit和Rollback中完成数据库事务的提交和回滚,同时释放连接。

tx事务环境中,只有一个数据库连接,事务内的Eexc都是依次执行的,事务中也可以使用db进行查询,但是db查询的过程会新建连接,这个连接的操作不属于该事务。

一些语句

  1. 批量插入

    1
    INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
  2. 存在则更新,否则插入(也需要设置主键uniq,防止主键冲突)

    1
    INSERT INTO t1 (a, b, c) VALUES (1, 2, 3) ON DUPLICATE KEY UPDATE a=1, b=2, c=3;

参考内容

Golang Mysql笔记(一)— 连接与连接池
Golang Mysql笔记(二)— CURD基础
Golang Mysql笔记(三)— Prepared剖析
Golang Mysql笔记(四)— 事务