我们使用 https://github.com/Go-SQL-Driver/MySQL 作为Go连接MySQL的驱动,进行数据库操作练习。
(1)导入数据库驱动
import (
_"github.com/Go-SQL-Driver/MySQL"
)
这里使用 _ 的意思是引入后面的包名而不直接使用这个包中定义的函数,变量等资源。若出现无法导入的情况,我们可以使用以下方式解决(以 window系统为例)
windows+R 打开cmd,
输入go get github.com/vmihailenco/redis ,
回车之后会自动下载项目到GOPATH中的src目录下,然后刷新IDE。
(2)数据库连接
使用 sql.Open 用来打开一个注册过的数据库驱动,这里有几种连接方式,如下所示,一般我们选用第二种方式
user@unix(/path/to/socket)/dbname?charset=utf8
user:password@tcp(localhost:3306)/dbname?charset=utf8
user:password@/dbname
user:password@tcp([de:ad:be:ef::ca:fe]:80)/dbname
(3)增删改查操作
package main
import (
"database/sql"
"fmt"
_"github.com/Go-SQL-Driver/MySQL"
)
var(
DBHostsIp = "localhost:3306"
DBUserName = "root"
DBPassWord = "123456"
DBName = "localmysql"
)
func main(){
//连接至数据库
db,err := sql.Open("mysql", DBUserName+":"+DBPassWord+"@tcp("+DBHostsIp+")/"+DBName)
CheckErr(err)
insert(db)
//关闭数据库连接
db.Close()
}
//插入demo
func insert(db *sql.DB) {
//准备插入操作
stmt,err := db.Prepare("INSERT user (user_name,user_age,user_sex) values (?,?,?)")
CheckErr(err)
//执行插入操作
res,err := stmt.Exec("limao",26,2)
CheckErr(err)
//返回最近的自增主键id
id,err := res.LastInsertId()
fmt.Println("LastInsertId: ",id)
}
//查询demo
func query(db *sql.DB) {
//rows:返回查询操作的结果集
rows,err := db.Query("SELECT * FROM user")
CheckErr(err)
//第一步:接收在数据库表查询到的字段名,返回的是一个string数组切片
columns, _ := rows.Columns() // columns: [user_id user_name user_age user_sex]
//根据string数组切片的长度构造scanArgs、values两个数组,scanArgs的每个值指向values相应值的地址
scanArgs := make([]interface{}, len(columns))
values := make([]interface{}, len(columns))
for i := range values {
scanArgs[i] = &values[i]
}
for rows.Next() {
//将查询到的字段名的地址复制到scanArgs数组中
err = rows.Scan(scanArgs...)
CheckErr(err)
//将行数据保存到record字典
record := make(map[string]string)
for i, col := range values {
if col != nil {
//字段名 = 字段信息
record[columns[i]] = string(col.([]byte))
}
}
fmt.Println(record)
}
}
//更新demo
func update(db *sql.DB) {
//准备更新操作
stmt1,err := db.Prepare("UPDATE user SET user_age=?,user_sex=? WHERE user_id=?")
CheckErr(err)
//执行更新操作
res1, err := stmt1.Exec(21, 2, 1)
CheckErr(err)
//查询更新多少条信息
num, err := res1.RowsAffected()
CheckErr(err)
fmt.Println(num)
}
//删除demo
func remove(db *sql.DB) {
//准备删除操作
stmt, err := db.Prepare(`DELETE FROM user WHERE user_id=?`)
CheckErr(err)
//执行删除操作
res, err := stmt.Exec(1)
CheckErr(err)
//查询删除多少条信息
num, err := res.RowsAffected()
CheckErr(err)
fmt.Println(num)
}
//检查错误信息
func CheckErr(err error) {
if err != nil {
panic(err)
}
}
总结:
db.Prepare()函数用来返回准备要执行的sql操作,然后返回准备完毕的执行状态。
db.Query()函数用来直接执行Sql返回Rows结果。
stmt.Exec()函数用来执行stmt准备好的SQL语句。
我们可以看到我们传入的参数都是=?对应的数据,这样做的方式可以一定程度上防止SQL注入。
有疑问加站长微信联系(非本文作者)