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

小杰的快乐时光 · · 1324 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。


我们使用 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注入。

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


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:小杰的快乐时光

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

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1324 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传