go操作mysql

database/sql

原生支持连接池,是并发安全的

这个标准库没有具体实现,只是列出了一些需要第三方库实现的具体内容

下载驱动

go get -u github.com/go-sql-driver/mysql

连接数据库

package main

import (
    "database/sql"
    "fmt"

    _ "github.com/go-sql-driver/mysql" //导入并且没有使用,所以默认调用init方法,在底层会注册一个叫mysql的驱动
)

func main() {
    //连接数据库
    dsn := "root:123123@tcp(127.0.0.1:3306)/godb"
    //Open不会校验用户名密码是否正确,只能校验数据格式对不对
    db, err := sql.Open("mysql", dsn)
    if err != nil {
        fmt.Println("连接错误", nil)
        return
    }
    err = db.Ping() //尝试连接数据库
    if err != nil {
        fmt.Println("打开数据库失败", dsn, err)
        return
    }

    fmt.Println("连接数据库成功")

}

查询单条记录

package main

import (
    "database/sql"
    "fmt"

    _ "github.com/go-sql-driver/mysql" //导入并且没有使用,所以默认调用init方法,在底层会注册一个叫mysql的驱动
)

var db *sql.DB

//数据库三个字段 主键id,name,age
func initDB() (err error) {
    //连接数据库 账号root 密码123123 数据库名 godb
    dsn := "root:123123@tcp(127.0.0.1:3306)/godb"
    //Open不会校验用户名密码是否正确,只能校验数据格式对不对
    db, err = sql.Open("mysql", dsn)
    if err != nil {
        return
    }
    err = db.Ping() //尝试连接数据库
    if err != nil {
        return
    }
    //设置数据库连接池的最大连接数
    db.SetMaxIdleConns(10)

    return
}

type user struct {
    id   int
    name string
    age  int
}

//删
func delete(id int) {
    sqlStr := `delete from user where id=?`
    ret, err := db.Exec(sqlStr, id)
    if err != nil {
        fmt.Println("删除失败", err)
        return
    }
    n, err := ret.RowsAffected()
    if err != nil {
        fmt.Println("获取删除记录错误", err)
        return
    }
    fmt.Println("更新了", n, "条数据")

}

//查询单条
func queryOne(id int) {
    var u1 user
    //sql语句编写
    sqlStr := `select id,name,age from user where id=?`
    rowObj := db.QueryRow(sqlStr, id) //从连接池那里连接查询出一个单挑记录
    //拿到结果,
    rowObj.Scan(&u1.id, &u1.name, &u1.age) //必须对rowObj对象调用Scan方法,因为该方法会释放数据库连接
    fmt.Printf("u1:%#v\n", u1)
}
func insert() {
    //sql
    sqlStr := `insert into user(name,age) values("名字",20)`
    ret, err := db.Exec(sqlStr)
    if err != nil {
        fmt.Println("执行sql错误", err)
        return
    }
    //如果是插入数据的操作,能够拿到插入数据的id值
    id, err := ret.LastInsertId()
    if err != nil {
        fmt.Println("获取id错误", err)
        return
    }
    fmt.Println("id:", id)
}

//查询多条
func queryMore(n int) {
    //sql
    sqlStr := `select id,name,age from user where id > ?;`
    rows, err := db.Query(sqlStr, n)
    if err != nil {
        fmt.Println("查询错误", err)
        return
    }
    //关闭rows
    defer rows.Close()
    //循环取值
    for rows.Next() {
        var u1 user
        err := rows.Scan(&u1.id, &u1.name, &u1.age)
        if err != nil {
            fmt.Println("解析错误", err)
        }
        fmt.Println(u1) //取一条打印一条
    }
}

//改
func updateRow(newAge int, id int) {
    sqlStr := `update user set age=? where id=?`
    ret, err := db.Exec(sqlStr, newAge, id)
    if err != nil {
        fmt.Println("更新错误", err)
        return
    }
    n, err := ret.RowsAffected()
    if err != nil {
        fmt.Println("a", err)
        return
    }

    fmt.Println("更新了", n, "行数据")
}

func main() {
    err := initDB()
    if err != nil {
        fmt.Println("连接失败", err)
        return
    }
    fmt.Println("连接数据库成功")
    // queryOne(2)
    // queryMore(0)
    // insert()
    // updateRow(99, 2)
    delete(5)
}
Last modification:April 22, 2022
如果觉得我的文章对你有用,请随意赞赏