Go语言与MySql数据库(下)——gorm框架

一、简介

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", "<user>:<password>/<database>?
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

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,635评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,543评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,083评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,640评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,640评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,262评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,833评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,736评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,280评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,369评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,503评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,185评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,870评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,340评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,460评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,909评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,512评论 2 359