Go Web服务开发: 使用原生和ORM操作Mysql数据库(简单版)
1. 原生操作Mysql数据库(依赖mysql的驱动)
安装mysql驱动: go get github.com/go-sql-driver/mysql
- 使用Go语言连接处理Mysql的步骤和其他语言是很类似的, 打开数据库 -> 操作数据库 -> 关闭数据库这么三步操作,这里就按照这三步来完成mysql的简单操作 (注意,这里使用的是在beego框架中做的操作,原生写也是一样的)
import (
"database/sql"
"github.com/astaxie/beego"
_ "github.com/go-sql-driver/mysql"
)
type MysqlController struct {
beego.Controller
}
/**
* Go操作mysql创建User数据表
*/
func (this *MysqlController) CreateUserTable(){
// 1. 打开数据库:
// 使用sql.Open()方法去打开一个数据库连接
// 参数1: 驱动名称,也就是我们要操作的数据库类型, 这里是mysql
// 参数2: 连接字符串,格式为: 用户名:密码@协议tcp(地址:端口号)/数据库名称?charset=utf8(执行编码)
// 返回值1: 连接对象, 返回值2:错误信息
conn, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/testdata?charset=utf8")
if err != nil {
beego.Info("连接数据库错误", err)
return
}
// 3. 使用defer在函数执行完毕后调用Close方法关闭数据库
defer conn.Close()
// 2. 操作数据库:
// 使用Exec()方法执行sql语句完成数据库的操作
// 返回值是操作的结果和错误信息
_, err = conn.Exec("create table User(id int, name varchar(20))")
if err != nil {
beego.Info("操作数据库失败:", err)
return
}
this.Ctx.WriteString("Go操作Mysql创建User数据表成功")
}
- 以上便是原生Go使用mysql驱动操作mysql的最简单的实现了,除了上面使用到的Open(), Close(), Exec()三个方法外,还有一个比较常用的方法是查询数据的Query()
// 其他省略,只演示Query方法的使用
// Query()方法的参数是查询数据的sql语句
// 返回值是查询的结果和错误信息
rows, err := conn.Query("select id from User")
if err != nil {
beego.Info("查询数据库失败, ", err)
return
}
var id int
// 查询结果rows对象是可遍历的,依次取出查询的结果写入到id变量中
for rows.Next() {
// Scan方法将当前的这一条数据扫描到一个指定的地址
// 参数为一个变量的地址
rows.Scan(&id)
beego.Info("查询数据成功: ", id)
}
2. 使用ORM操作Mysql数据库
- 这里我使用的是beego框架,里面内置了orm操作的包,直接引入使用即可
/**
* ORM操作Mysql操作
* 1. 创建结构体和数据库结构之间的映射
* 2. 连接数据库:注册数据库
* 3. 注册数据库表
* 4. 生成数据表
*/
// 这里再models文件中进行上面步骤的初始化,避免之后的重复操作
// 创建数据表的映射结构体
type User struct {
Id int // Id为默认主键
Name string
}
func init() {
// 注册数据库:
// 参数1: 数据库别名
// 参数2: 数据库驱动名称,及就是连接数据库的类型
// 参数3: 数据库连接的相关信息,和使用sql.Open()打开数据库的第二个参数一样
orm.RegisterDataBase("default", "mysql", "root:123456@tcp(127.0.0.1:3306)/testdata?charset=utf8")
// 注册数据表:
// 参数: 需要注册的数据表的数据结构体, 当有多个表时使用逗号分隔
orm.RegisterModel(new(models.User))
// 生成数据表
// 参数1: 需要操作的数据库别名,数据库别名需要有一个default
// 参数2: 是否强制更新, 参数为boolean值, 一般设置为false
// 参数3: 是否可以看到创建数据表的过程, 参数也为bool值
orm.RunSyncdb("default", false, true)
}
- 这里完成数据库的增删改查操作
- 注意,这里的代码需要再上面的init()方法被执行初始化之后方才有效
// 使用ORM(对象关系映射)操作Mysql数据库
type OrmController struct {
beego.Controller
}
// 插入数据操作
func (this *OrmController) InsertOrm(){
// 1. 连接数据库,获取连接对象
o := orm.NewOrm()
// 2. 创建插入对象
user := models.User{}
user.Name = "chenSir"
// 执行插入操作, 参数为被插入对象的地址
// 返回值1: 插入影响的行数
// 返回值2: 错误信息
_, err := o.Insert(&user)
if err != nil {
beego.Info("插入数据失败了")
this.Ctx.WriteString("插入数据失败!")
}
this.Ctx.WriteString("插入数据成功!")
}
// 查询数据操作
func (this *OrmController) SelectOrm(){
// 获取连接对象
o := orm.NewOrm()
// 获取查询对象
user := models.User{Id: 1}
// 执行查询操作,
// 参数为查询对象地址,查询到的结果会写入到这个对象中
// 返回值是一个错误信息
err := o.Read(&user)
if err != nil {
beego.Info("查询失败")
return
}
data, err := json.Marshal(user)
if err != nil {
beego.Info("转化信息失败")
return
}
this.Ctx.WriteString(string(data))
}
// 更新数据操作
func (this *OrmController) UpdateOrm(){
// 1. 获取orm对象
o := orm.NewOrm()
// 2. 获取更新对象
user := models.User{
Id: 1,
}
// ** 3. 查询更新对象 **
err := o.Read(&user)
if err != nil {
beego.Info("查询数据错误,无法完成更新.")
return
}
// ** 4. 对查询到的更新对象赋值 **
user.Name = "ChenSirLaiLe"
// 5. 执行更新操作
// 返回值第一个为此次更新影响的数据行数
// 返回值第二个为更新操作的错误信息
_, err = o.Update(&user)
if err != nil {
beego.Info("更新数据错误")
return
}
this.Ctx.WriteString("更新数据成功")
}
// 删除数据操作
func (this *OrmController) DeleteOrm(){
// 1. 获取orm对象
o := orm.NewOrm()
// 2. 获取删除对象
user := models.User{Id: 1}
// 3. 执行删除操作
_, err := o.Delete(&user)
if err != nil {
beego.Info("执行删除操作失败")
return
}
this.Ctx.WriteString("删除数据成功了")
}
- 关于Go语言简单操作Mysql数据库就说这么多了,有任何问题欢迎大家留言讨论,我是Go萌新一枚,多多指正!!