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)
}