一、简介
ORM(Object Relation Mapping),对象关系映射,实际上就是对数据库的操作进行封装,对上层开发人员屏蔽数据操作的细节,开发人员看到的就是一个个对象,大大简化了开发工作,提高了生产效率。
二、 库安装
go get -u [github.com/jinzhu/gorm (http://github.com/jinzhu/gorm)
三、数据库连接
import (
//注意
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
var db *gorm.DB
func init() {
var err error
db, err = gorm.Open("mysql", ":/?
charset=utf8&parseTime=True&loc=Local")
if err != nil {
panic(err)
}
}
四、数据库操作
1、创建表
if !db.HasTable(&Like{}) {
if err := db.Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8").CreateTable(&Like{}).Error; err != nil {
panic(err)
}
}
直接通过 db.CreateTable 就可以创建表了,非常方便,还可以通过 db.Set 设置一些额外的表属性。
2、插入
like := &Like{
Ip: ip,
……
}
if err := db.Create(like).Error; err != nil {
return err
}
先构造已给对象,直接调用 db.Create() 就可以插入一条记录了。
3、删除
if err := db.Where(&Like{Hash: hash}).Delete(Like{}).Error; err != nil {
return err
}
先用 db.Where() 构造查询条件,再调用 db.Delete() 就可以删除。
4、查询
var count int
err := db.Model(&Like{}).Where(&Like{Ip: ip, Ua: ua, Title: title}).Count(&count).Error
if err != nil {
return false, err
}
先用 db.Model() 选择一个表,再用 db.Where() 构造查询条件,后面可以使用 db.Count() 计算数量,如果要获取对象,可以使用db.Find(&Likes) 或者只需要查一条记录 db.First(&Like)。
5、修改
db.Model(&user).Update("name", "hello")
db.Model(&user).Updates(User{Name: "hello", Age: 18})
db.Model(&user).Updates(User{Name: "", Age: 0, Actived:false}) // nothing update
这几个例子来自于官网,第一个是更新单条记录;第二个是更新整条记录,注意只有非空字段才会更新;第三个例子是不会更新的,在系统设计的时候要尽量避免这些空值有特殊的含义,如果一定要更新,可以使用第一种方式,设置单个值。
6、错误处理
其实你已经看到了,这里基本上所有的函数都是链式的,全部都返回 db 对象,任何时候调用 db.Error 就能获取到错误信息,非常方便。
7、事务的处理也很简单,用 db.Begin() 声明开启事务,结束的时候调用 tx.Commit(),异常的时候调用 tx.Rollback()。
8、其他还可以使用如下方式设置日志输出级别以及改变日志输出地方
db.LogMode(true)
db.SetLogger(gorm.Logger{revel.TRACE})
db.SetLogger(log.New(os.Stdout, "\r\n", 0))
五、实例分析
package main
import (
"fmt"
"time"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
type Like struct {
ID int `gorm:"primary_key"`
Ip string `gorm:"type:varchar(20);not null;"`
Ua string `gorm:"type:varchar(256);not null;"`
Title string `gorm:"type:varchar(128);not null;"`
Hash string `gorm:"unique_index:hash_idx"`
CreateAt time.Time
}
var db_1 *gorm.DB
func init() {
var err error
db_1, err = gorm.Open("mysql", "root:12345678@/mydatabase?charset=utf8")
if err != nil {
panic(err)
}
}
func main() {
//创建表
if err := db_1.CreateTable(&Like{}).Error; err != nil {
panic(err)
}
//插入
like := &Like{
ID: 2,
Ip: "HHH",
Ua: "JJJ",
Title: "Title",
Hash: "999",
CreateAt: time.Now(),
}
if err := db_1.Create(like).Error; err != nil {
fmt.Println(err)
}
//删除
if err := db_1.Where(&Like{ID: 1}).Delete(Like{}).Error; err != nil {
fmt.Println(err)
}
//查询1
Query1()
//查询2
Query2()
//遍历
QueryAll()
//更新
Update()
}
//查询1
func Query1() (bool, error) {
var count int //查到的数量
err := db_1.Model(&Like{}).Where(&Like{ID: 1}).Count(&count).Error
fmt.Println(count)
if err != nil {
return false, err
}
return false, err
}
//查询ID为1的Like
func Query2() {
var Likes Like
db_1.Model(&Like{}).Where(&Like{ID: 1}).Find(&Likes)
fmt.Println(Likes)
}
//查询全部数据
func QueryAll() {
var tables []Like
err := db_1.Where(&Like{}).Find(&tables)
if err != nil {
fmt.Println(err)
}
fmt.Println(tables)
}
//更新数据
func Update() {
db_1.Model(&Like{}).Where(Like{ID: 2}).Updates(Like{Ip: "Hello"}) //Model
}