史上最详解golang操控数据库实现多对一的CRUD
前言
Golang 提供了database/sql包用于对SQL数据库的访问, 作为操作数据库的入口对象sql.DB, 主要为我们提供了两个重要的功能:
sql.DB 通过数据库驱动为我们提供管理底层数据库连接的打开和关闭操作.
sql.DB 为我们管理数据库连接池
需要注意的是,sql.DB表示操作数据库的抽象访问接口,而非一个数据库连接对象;它可以根据driver打开关闭数据库连接,管理连接池。正在使用的连接被标记为繁忙,用完后回到连接池等待下次使用。所以,如果你没有把连接释放回连接池,会导致过多连接使系统资源耗尽。
下面的几个操作里面我们都将采用同一个数据库表结构:数据库test,歌曲表music,关联歌手信息表singer。
CREATE TABLE music
(
id
int(11) NOT NULL AUTO_INCREMENT COMMENT ‘歌曲id’,
name
varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT ‘歌曲名称’,
year
int(11) DEFAULT NULL COMMENT ‘创建年份’,
singerId
int(11) DEFAULT NULL COMMENT ‘歌手名称id’,
PRIMARY KEY (id
)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE singer
(
sid
int(11) NOT NULL COMMENT ‘歌手id’,
sname
varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT ‘歌手名称’,
PRIMARY KEY (sid
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
1.导入mysql数据库驱动
2.连接数据库
通过调用sql.Open函数返回一个sql.DB指针; sql.Open函数原型如下:
driverName: 使用的驱动名. 这个名字其实就是数据库驱动注册到 database/sql 时所使用的名字.
dataSourceName: 数据库连接信息,这个连接包含了数据库的用户名, 密码, 数据库主机以及需要连接的数据库名等信息.
《-------------------------案列显示---------------------------》
调用 db.Query 执行 SQL 语句, 此方法会返回一个 Rows 作为查询的结果
sql.Open并不会立即建立一个数据库的网络连接, 也不会对数据库链接参数的合法性做检验, 它仅仅是初始化一个sql.DB对象. 当真正进行第一次数据库查询操作时, 此时才会真正建立网络连接;
3.查询全部数据
通过 rows.Next() 迭代查询数据.
通过 rows.Scan() 读取每一行的值 .
rows.Scan 参数的顺序很重要, 需要和查询的结果的column对应.
例如 “select m.,s. from music m left join singer s on m.singerId = s.sid” 查询的行的 column 顺序是 “id, name, year,singerId,sid,sname” 和插入操作顺序相同, 因此 rows.Scan 也需要按照此顺序rows.Scan(&id,&name,&year,&singerId,&sid,&sname), 不然会造成数据读取的错位.
一般用Prepared Statements[预编译语句]和Exec()[插入数据]完成INSERT, UPDATE, DELETE操作
4.添加数据
先根据通过Prepared Statements[预编译语句],在通过db.Exec()插入数据,通过返回的err可知插入失败的原因.
5.修改数据
先根据通过Prepared Statements[预编译语句],在通过db.Exec()插入数据,通过返回的err可知插入失败的原因.
rese可以进一步查询本次插入数据影响的行数RowsAffected
6.删除数据
先根据通过Prepared Statements[预编译语句],在通过db.Exec()插入数据。
rese可以进一步查询本次插入数据影响的行数RowsAffected,通过返回的err可知插入失败的原因.
7.获取错误
paric(err)是获取到真正意义上的错误
8.总结:
db.Query()函数用来直接执行Sql返回Rows结果。
db.Prepare()函数用来返回准备要执行的sql操作,然后返回准备完毕的执行状态
stmr.Exec()函数用来执行stmt准备好的SQL语句