最近在看gin框架的使用,众多的文档和教程中都比较推荐使用 gorm 来操作数据库,但是我本人对orm实在无感,所在还是学习一下使用原生的sql来操作MySQL吧。
https://github.com/go-sql-driver/mysql
一、准备数据
使用 docker 启一个mysql容器,简单构建张表,随便插入几条数据
二、连接数据库
本文并没有在gin框架下使用,而是简单的使用demo 程序,具体在项目中还需要再对其进行封装。
database/sqlgithub.com/go-sql-driver/mysql
sql.Open
这里在连接以后,又对连接进行了三个设置。
conn.SetConnMaxLifetime
show global variables like '%timeout%';wait_timeout
conn.SetMaxOpenConns(10)conn.SetMaxOpenConns(10)
SetMaxIdleConnsSetMaxOpenConns
官方的解释为
db.SetMaxIdleConns()db.SetMaxOpenConns()SetMaxOpenConns()
三、查询数据
*sql.DB
使用Query查询所有符合条件的记录
*sql.Rows
这里主要的代码为
这里有两行代码比较关键
Scan copies the columns in the current row into the values pointed at by dest. The number of values in dest must be the same as the number of columns in Rows.
rows.Scan
select * from yyx_test
很多文章教程中都会说这里必须要定义一个结构体变量,其实可以不用定义,只要保证Scan函数里的指针变量类型与数据库字段类型对应就可以,完全可以使用以下来接收。
使用QueryRow来返回一条数据
QueryRow的使用和Query几乎一样,只是它返回的不是Rows,而是Row,一条记录,如果sql语句查询到多条记录,那也只返回第一条。
sql: no rows in result set
这点比Query 好,Query返回*Rows,error, 如果查询不到数据的话是没有error, 只有当sql 语句有问题或者数据库本身的问题如连接中断了才会记录在error中。
使用Stmt语句进行查询
有时候一条语句可能会在多条查询中使用,比如
这时就可用到Stmt, 将公共的部分抽出来
之后就可以使用stmt的Query或者QueryRow方法了
?
参考链接