首先我们登录mysql,先创建一个表user。如下所示:
然后我们向其增加一行数据:
下面的增删改查操作,就围绕着这个表来展开。main函数如下所示:
一、增
首先我们定义一个sqlStr,其中的string语句是sql语句,只不过值我们用占位符"?"来表示,接下来我们用Exec()方法来进行对数据库表中条例的增加操作,该函数的第一个参数是string类型的含占位符的sql语句,后两个参数就是用来填充语句中的占位符的。返回一个ret和err。
调用ret.LastInsertId()来查找上一次插入数据的id,最后的输出结果如下:
mysql中查看结果:
这样就说明,我们成功向数据库中添加了条例。
注:不同的数据库中,sql语句使用的占位符语法也不同:
二、删
已知mysql的user表中现在有以下字段:
执行删除函数之后,输出如下:
再查看mysql的user表单如下:
执行完毕后,可以发现id=3的字段已经被删除。
三、改
执行函数之后,输出结果:
可以发现sql表单中id=1的age字段已经被改成了39。
四、查
1、查询单行数据
sqlStr是一个含有通配符"?"的string类型sql语句。QueryRow()返回的是查询到的行(row)变量,参数一就是我们定义的sql语句,参数二是填入占位符"?"中的值。
这里要注意,执行QueryRow()之后,一定要执行Scan()方法,因为
Scan方法中,有个延迟关闭函数。如果不关闭就意味着持有的数据库不会被释放,就会引发后续的很多问题。Scan函数的三个参数,对应我们定义的user结构体的三个变量:
这里我们查询的是id为1的变量,输出结果如下:
这与我们的sql表单中一致,即成功完成查询单条数据
2、查询多行数据
查询函数如下:
多行查询db.Query()执行一次查询,返回多行结果(即Rows),一般用于执行select命令。
值得注意的是,我们中间自己写了defer db.Close()来延迟关闭。但是我们之前说过Scan方法中就有Close()方法来关闭,为什么还要多此一举呢?
这是因为for循环未必成功执行完。
输出如下:
对比sql表单:
说明多行查询成功。