go操作MySQL
依赖
go get github.com/go-sql-driver/mysql
实例
CREATE DATABASE IF NOT EXISTS `go_db` charset=utf8mb4;
package daily
import (
"context"
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
var (
DB *sql.DB
)
func InitMysqlDB() error {
var err error
dsn := "root:python@tcp(127.0.0.1:3306)/go_db?charset=utf8mb4&parseTime=True&loc=Local"
db, err := sql.Open("mysql", dsn)
if err != nil {
return err
}
if err = db.Ping(); err != nil {
return err
}
db.SetConnMaxLifetime(time.Minute)
db.SetMaxOpenConns(10)
db.SetMaxIdleConns(10)
DB = db
return err
}
func MysqlOp() {
err := InitMysqlDB()
if err != nil || DB == nil {
fmt.Println("数据库初始化失败=" + err.Error())
return
} else {
fmt.Println("数据库初始化成功")
}
table_delete := `DROP TABLE IF EXISTS user`
if _, err := DB.Exec(table_delete); err != nil {
fmt.Println("删除表失败="+ err.Error())
return
} else {
fmt.Println("删除表成功")
}
table_create := `CREATE TABLE IF NOT EXISTS user (
id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '用户编号',
name VARCHAR(8) NOT NULL COMMENT '用户名称',
age TINYINT(3) UNSIGNED NOT NULL DEFAULT 0 COMMENT '用户年龄',
PRIMARY KEY (id))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci
COMMENT = '用户表'`
if _, err := DB.Exec(table_create); err != nil {
fmt.Println("创建表失败=", err.Error())
return
} else {
fmt.Println("创建表成功")
}
stmt, err := DB.Prepare(`insert into user(name, age)values(?,?)`)
defer stmt.Close()
if err != nil {
fmt.Println("新增Pre失败=", err.Error())
return
} else {
if r, err := stmt.Exec("陈一", 10); err != nil {
fmt.Println("1-新增Exc失败=", err.Error())
} else {
if id, err := r.LastInsertId(); err != nil {
fmt.Println("1-新增失败LastInsertId1=", err.Error())
} else {
fmt.Println("1-新增成功id=", id)
}
}
}
r, err := DB.Exec(`insert into user(name, age)values(?,?)`, "王二", 12)
if err != nil {
fmt.Println("2-新增失败Exec=" + err.Error())
return
}
if id, err := r.LastInsertId(); err != nil {
fmt.Println("2-新增失败LastInsertId=", err.Error())
} else {
fmt.Println("2-新增成功id=", id)
}
type myUser struct {
id uint
name string
age uint8
}
var u myUser
if err = DB.QueryRow(`select * from user where id=?`, 1).Scan(&u.id, &u.name, &u.age); err != nil {
fmt.Println("单行查询错误=" + err.Error())
return
}
fmt.Println("单行查询成功=", u)
rows, err := DB.Query(`SELECT * FROM user`)
if err != nil {
fmt.Println("多行查询错误=" + err.Error())
return
}
defer rows.Close()
for rows.Next() {
err := rows.Scan(&u.id, &u.name, &u.age)
if err != nil {
fmt.Println("多行查询scan错误=" + err.Error())
return
}
fmt.Printf("多行查询(%T)=%v\n", u, u)
}
if res, err := DB.Exec(`update user set age=? where id=?`, 22, 2); err != nil {
fmt.Println("更新失败=", err.Error())
return
} else {
affected, _ := res.RowsAffected()
fmt.Println("更新成功行数=", affected)
}
if res, err := DB.Exec(`delete from user where id=?`, 1); err != nil {
fmt.Println("删除失败=", err.Error())
return
} else {
affected, _ := res.RowsAffected()
fmt.Println("删除成功行数=", affected)
}
tx := sql.TxOptions{sql.LevelRepeatableRead, false}
mTx, err := DB.BeginTx(context.Background(), &tx)
if err != nil {
fmt.Println("事务开始失败=", err.Error())
return
}
res, err := mTx.Exec(`delete from user`)
if err != nil {
fmt.Println("事务执行失败=", err.Error())
}
affected, _ := res.RowsAffected()
fmt.Println("影响行数=", affected)
if err := mTx.Rollback(); err != nil {
fmt.Println("事务回滚失败=", err.Error())
return
} else {
fmt.Println("事务回滚成功")
}
if err := mTx.Commit(); err != nil {
fmt.Println("事务提交失败=", err.Error())
} else {
fmt.Println("事务提交失成功")
}
}

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统