GoLang—gorm实现数据库操作

RM框架介绍

ORM框架是专业开发人员必备的数据库操作手段,有关ORM框架的介绍不再详细介绍,读者可以点击(ORM框架介绍)查看相关介绍。

在GoLang中,主流的ORM框架有gorm、xorm和gorose等,三者各有优缺点并且有相应的文档支持,便于大家学习和查阅,本文将简单介绍gorm框架的使用

gorm

本文根据gorm的官方文档,简单说明gorm的使用方式,以数据表index_label为例,表中设有字段id和name,字段id为主键。首先在CMD窗口下安装gorm框架,安装方法如下:

go get -u github.com/jinzhu/gorm

1

然后在数据表index_label实现数据的增删改查操作,详细代码及其注释如下所示。

package main

import (

"fmt"

"github.com/jinzhu/gorm"

_ "github.com/jinzhu/gorm/dialects/mysql"

)

type Label struct {

// gorm.Model是一个基本结构体,它包括以下字段:ID,CreatedAt,UpdatedAt,DeletedAt

// 在自定义的结构体中加入gorm.Model,即为该结构体添加字段:ID,CreatedAt,UpdatedAt,DeletedAt

// gorm.Model   // 参考http://gorm.io/docs/conventions.html

Id int `gorm:"PRIMARY_KEY"`

Name string `gorm:"type:varchar(10)"`

}

// 结构体Label默认的数据表名为labels

// 禁用表名的复数,如果设置为true,`User`的表名将为`user`,设置所示:db.SingularTable(true)

// 如果自定义数据表名,可自定义的TableName方法

func (Label) TableName() string{

return "index_label"

}

// 参考文档http://gorm.io/docs/models.html

func main(){

// 数据库的连接方式来自github.com/go-sql-driver/mysql

db, err := gorm.Open("mysql","root:1234@(localhost:3306)/music_db?charset=utf8&parseTime=True&loc=Local")

if err != nil {

fmt.Println(err)

}

// defer是当前函数执行结束后的时候会被调用

defer db.Close()

// 设置连接池

db.DB().SetMaxIdleConns(10)

db.DB().SetMaxOpenConns(100)

db.AutoMigrate(&Label{})

//————————————————————————————————————————————————————————————————————————————————————

// 新建数据

lable := Label{Name: "测试数据"}

db.Create(&lable)

// NewRecord是判断当前数据是否有主键,其作用不大

//id := db.NewRecord(&lable)

//fmt.Println(id)

//————————————————————————————————————————————————————————————————————————————————————

// 查询数据

// 创建数组对象l,数组元素为结构体Label

var l []Label

// 查询数据表index_label的字段name不等于"5555"的数据,并将结果写入数组对象l

db.Where("name <> ?","5555").Find(&l)

// 输出查询结果

fmt.Println(l)

// Scan将查询结果转移到数组对象ls

var ls []Label

db.Model(&Label{}).Where("id = ?","1").Scan(&ls)

// 上述查询方式等价于db.Where("id = ?","1").Find(&ls)

fmt.Println(ls)

// 更多的数据查询方式请参考http://gorm.io/docs/query.html

//————————————————————————————————————————————————————————————————————————————————————

// 更新数据

// Update是更新某个字段的数据

db.Where("id = ?","1").Find(&l).Update("name", "更新数据")

// Updates是更新多个字段的数据

db.Model(&Label{}).Where("id = ?","1").Updates(Label{Name: "更新数据2"})

// 上述方式等价于db.Where("id = ?","1").Find(&l).Updates(Label{Name: "更新数据2"})

//————————————————————————————————————————————————————————————————————————————————————

// 删除数据

db.Where("name = ?","测试数据").Delete(Label{})

// 如果不使用Where,可以实例化结构体Label,从而删除对应的数据

// 比如删除id=8的数据:db.Delete(Label{Id: 8})

//————————————————————————————————————————————————————————————————————————————————————

// 执行原生的SQL语句

var name string

// 查询数据使用Raw方法

// 如果查询单行数据,使用Row即可,如果多行数据则使用Rows

db.Raw("select name from index_label where id=6").Row().Scan(&name)

fmt.Println(name)

// 删除、新增或更新数据使用Exec方法

db.Exec("delete from index_label where id=7")

}

本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是一个个人学习交流的平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽,造成漏登,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。