上一篇教程我们了解到了基础的GO语法,今天我们来学习如何使用GO操作mysq,下面就直接进入步骤操作环节
技术版权归属
广州市金狮网络科技有限公司 (https://kingc.cn/),如需商用请联系公司
1. 先获取mysql驱动,类似Java加载驱动jar, 通过window cmd命令或者Linux控制台执行
go get github.com/go-sql-driver/mysql
2. 我们先写个数据库连接对象方便扩展
// 数据库配置
type DBConfig struct {
Host string // 地址IP
Port int // 数据库端口
Database string // 数据库名称
Username string // 账号
Password string // 密码
}
3. 通过数据库配置进行mysql实例化
func NewMysql() (*sql.DB, error) {
// 初始化mysql连接参数
conf := DBConfig{
Host: "127.0.0.1",
Port: 3306,
Database: "test",
Username: "root",
Password: "123456",
}
// 定义占位符字符串,使用配置值替换%s和%d
link := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8", conf.Username, conf.Password, conf.Host, conf.Port, conf.Database)
// 打开mysql获得实例对象
db, err := sql.Open("mysql", link)
// 打开mysql失败,返回nil对象,以及返回err对象
if err != nil {
panic(util.AddStr("mysql初始化失败: ", err.Error()))
return nil, errors.New("mysql初始化失败: " + err.Error())
}
// 打开mysql成功返回db对象,err=nil
return db, nil
}
4. 获得mysql操作实例后,进行增删查改操作(由于时间关系,暂时只写了新增示例,包含事务和非事务)
func CRUD(db *sql.DB) error {
// 编写需要执行的sql
createSql := "insert test_user(username, password, age, sex) values(?,?,?,?)"
// 预编译sql
stmt, err := db.Prepare(createSql)
if err != nil {
panic("预编译失败: " + err.Error())
}
// 提交编译sql对应参数
ret, err := stmt.Exec("zhangsan", "123456", 18, 1)
if err != nil {
panic("提交数据失败: " + err.Error())
}
// 保存成功后获取自增ID
fmt.Println(ret.LastInsertId())
return nil
}
func CRUD1(db *sql.DB) error {
// 编写需要执行的sql
createSql := "insert test_user(username, password, age, sex) values(?,?,?,?)"
// 预编译sql,事务模式
tx, err := db.Begin()
if err != nil {
panic("开启事务失败: " + err.Error())
}
stmt, err := tx.Prepare(createSql)
if err != nil {
tx.Rollback() // 回滚事务
panic("预编译失败: " + err.Error())
}
// 提交编译sql对应参数
ret, err := stmt.Exec("zhangsan", "123456", 18, 1)
if err != nil {
tx.Rollback() // 回滚事务
panic("提交数据失败: " + err.Error())
}
// 保存成功后获取自增ID
fmt.Println(ret.LastInsertId())
tx.Commit() // 提交事务
return nil
}
5. 最后执行测试用例test
func TestMysql1(t *testing.T) {
db, err := NewMysql()
if err != nil {
panic(err)
}
CRUD(db)
}
func TestMysql2(t *testing.T) {
db, err := NewMysql()
if err != nil {
panic(err)
}
CRUD1(db)
}
上面的几个示例基本涵盖GO操作mysql的用法,下一篇文章我会讲解如何封装可扩展性强的mysql底层,敬请期待!