Go语言 Web开发(6)使用GO连接MySQL数据库操作


我们使用 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"
)

const(
   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注入。

参考文章:http://www.01happy.com/golang-mysql-demo/

你可能感兴趣的:(Go语言 Web开发(6)使用GO连接MySQL数据库操作)