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.DBfunc init() {var err errordb, err = gorm.Open("mysql", "<user>:<password>/<database>?charset=utf8&parseTime=True&loc=Local")if err != nil {panic(err)}}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 设置少量额外的表属性。
like := &Like{Ip: ip,……}if err := db.Create(like).Error; err != nil {return err}先构造已给对象,直接调用 db.Create() 即可以插入一条记录了。
if err := db.Where(&Like{Hash: hash}).Delete(Like{}).Error; err != nil {return err}先用 db.Where() 构造查询条件,再调用 db.Delete() 即可以删除。
var count interr := db.Model(&Like{}).Where(&Like{Ip: ip, Ua: ua, Title: title}).Count(&count).Errorif err != nil {return false, err}先用 db.Model() 选择一个表,再用 db.Where() 构造查询条件,后面可以使用 db.Count() 计算数量,假如要获取对象,可以使用db.Find(&Likes) 或者者只要要查一条记录 db.First(&Like)。
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这几个例子来自于官网,第一个是升级单条记录;第二个是升级整条记录,注意只有非空字段才会升级;第三个例子是不会升级的,在系统设计的时候要尽量避免这些空值有特殊的含义,假如肯定要升级,可以使用第一种方式,设置单个值。
其实你已经看到了,这里基本上所有的函数都是链式的,一律都返回 db 对象,任何时候调用 db.Error 就能获取到错误信息,非常方便。
db.LogMode(true)db.SetLogger(gorm.Logger{revel.TRACE})db.SetLogger(log.New(os.Stdout, "\r\n", 0))package mainimport ("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.DBfunc init() {var err errordb_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)}//查询1Query1()//查询2Query2()//遍历QueryAll()//升级Update()}//查询1func Query1() (bool, error) {var count int //查到的数量err := db_1.Model(&Like{}).Where(&Like{ID: 1}).Count(&count).Errorfmt.Println(count)if err != nil {return false, err}return false, err}//查询ID为1的Likefunc Query2() {var Likes Likedb_1.Model(&Like{}).Where(&Like{ID: 1}).Find(&Likes)fmt.Println(Likes)}//查询一律数据func QueryAll() {var tables []Likeerr := 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}
¥60.00
PC中文 steam正版 死亡循环 DEATHLOOP 国区cdkey激活码 标准豪华版
¥56.00
Steam 太吾绘卷 激活码CDKey The Scroll Of Taiwu PC游戏中文正版 神话武侠为题材独立 24小时自动发货
¥40.39
PC中文正版 steam平台 国区 经营模拟游戏 仙剑客栈2 激活码 兑换码
¥58.00
PC中文正版steam游戏 State of Decay 2: Juggernaut Edition 腐烂国度2巨霸版 主宰版国区激活码CDK
¥59.50
steam PC中文正版 鬼谷八荒 激活码CDKey 开放世界的沙盒修仙游戏 简体 下载
¥2.90
PC正版 steam平台 国区 游戏 生存主义 Survivalist 生存专家 幸存者 激活码 CDkey