GO 操作MySQL数据库

GO 操作MySQL数据库

MySQL驱动安装

使用第三方开源的mysql库: http://github.com/go-sql-driver/mysql (mysql驱动) http://github.com/jmoiron/sqlx (基于mysql驱动的封装) 分别执行如下命令行:

  go get github.com/go-sql-driver/mysql 
   go get github.com/jmoiron/sqlx

下载完成后会在GO环境的GOPATH路径生成对应的文件。

_"http://github.com/go-sql-driver/mysql"

这行不能省略,这是MySQL的驱动包,重点是加个下划线 _ ,用来初始化驱动。 file

以上代码,如果连接成功后打印数据连接的指针,如图所示: file

操作数据库,基本的CRUD 插入:插入一条用户信息

package main

import (
    "fmt"
    _ "github.com/go-sql-driver/mysql"
    "github.com/jmoiron/sqlx"
)

//用户结构体
type Users struct {
    UserId   int    `db:"user_id"`
    Username string `db:"username"`
    Sex      string `db:"sex"`
    Email    string `db:"email"`
}

//数据库指针
var db *sqlx.DB

//初始化数据库连接,init()方法系统会在动在main方法之前执行。
func init() {
    database, err := sqlx.Open("mysql", "root:q1454739828@tcp(127.0.0.1:3306)/mytest")
    if err != nil {
        fmt.Println("open mysql failed,", err)
    }
    db = database
}

func main() {

    sql := "insert into user(username,sex, email)values (?,?,?)"
    value := [3]string{"user01", "man", "user01@163.com"}

    //执行SQL语句
    r, err := db.Exec(sql, value[0], value[1], value[2])
    if err != nil {
        fmt.Println("exec failed,", err)
        return
    }

    //查询最后一天用户ID,判断是否插入成功
    id, err := r.LastInsertId()
    if err != nil {
        fmt.Println("exec failed,", err)
        return
    }
    fmt.Println("insert succ", id)

}

插入成功后,打印出一个编号。同时查看Navicat,确认插入成功。

查询:查询user_id为2的用户信息

func main() {

    var users []Users
    sql := "select user_id, username,sex,email from user where user_id=? "
    err := db.Select(&users, sql, 2)
    if err != nil {
        fmt.Println("exec failed, ", err)
        return
    }
    fmt.Println("select succ:", users)

}

更新:把user_id为2的用户的username修改为 "user002"

func main() {

    //执行SQL语句
    sql := "update user set username =? where user_id = ?"
    res, err := db.Exec(sql, "user002", 2)

    if err != nil {
        fmt.Println("exec failed,", err)
        return
    }

    //查询影响的行数,判断修改插入成功
    row, err := res.RowsAffected()
    if err != nil {
        fmt.Println("rows failed", err)
    }

    fmt.Println("update succ:", row)

}

删除:删除user_id 为2的用户信息

func main() {

    sql := "delete from user where user_id=?"

    res, err := db.Exec(sql, 2)
    if err != nil {
        fmt.Println("exce failed,", err)
        return
    }

    row, err := res.RowsAffected()
    if err != nil {
        fmt.Println("row failed, ", err)
    }
    fmt.Println("delete succ: ", row)
}

事务

func main() {

    //开启事务
    conn, err := db.Begin()
    if err != nil {
        fmt.Println("begin failed :", err)
        return
    }

    //执行插入语句
    r, err := conn.Exec("insert into user(username, sex, email)values(?, ?, ?)", "user01", "man", "usre01@163.com")

    if err != nil {
        fmt.Println("exec failed, ", err)
        conn.Rollback()      //出现异常,进行回滚操作
        return
    }

    id, err := r.LastInsertId()
    if err != nil {
        fmt.Println("exec failed, ", err)
        conn.Rollback()
        return
    }
    fmt.Println("insert succ:", id)

    r, err = conn.Exec("insert into user(username, sex, email)values(?, ?, ?)", "user02", "man", "user02@163.com")
    if err != nil {
        fmt.Println("exec failed, ", err)
        conn.Rollback()
        return
    }
    id, err = r.LastInsertId()
    if err != nil {
        fmt.Println("exec failed, ", err)
        conn.Rollback()
        return
    }
    fmt.Println("insert succ:", id)

    conn.Commit()
}

总结: Go语言操作MySQL比较容易,和其他语言没有太大区别,就是过多的error处理很影响代码的美观性,真正使用的时候可以把error封装为对应的方法,如下代码所示。

func HandleError(err error, why string) {
    if err != nil {
        fmt.Println(why, err)
    }
}
猜你喜欢