您现在的位置是:首页 > 技术笔记 > Go语言Go语言

go操作数据库之gorm

冰山2019-05-09【Go语言】人已围观

简介gorm的简单Demo的实例

之前用go操作数据库是直接用的 github.com/go-sql-driver/mysql 访问数据库都是直接用写 sql,取出结果然后自己拼成对象,使用上面不是很方便,可读性也不好,前段时间在学习谢大的beego框架,其中的gorm模块操作数据库十分地方便,就去 github 上找了一下 golang 里面有没有类似的东西,果然已经有非常成熟的框架了,github.com/jinzhu/gorm 已经有 13k+ 的 star 了。

ORM(Object Relation Mapping),对象关系映射,实际上就是对数据库的操作进行封装,对上层开发人员屏蔽数据操作的细节,开发人员看到的就是一个个对象,大大简化了开发工作,提高了生产效率。

下面我以一个记录用户操作行为的功能为例,介绍一下 gorm 的简单用法。
 

1)库安装

go get -u github.com/jinzhu/gorm

2)数据库连接

//数据库基本配置信息
const(
	//username mysql账号
	userName = "root"
	//password mysql密码
	passWord = "123456"
	//ip   mysql数据库的IP
	ip = "127.0.0.1"
	//port  mysql数据库的端口
	port = "3306"
	// database 需要连接的数据库名称
	database = "RecordUser
)

//拼接连接数据库地址
func  sourceName2 (userName , passWord ,ip , port, database string) string{
	var connection string
	connection =  userName + ":" + passWord +"@tcp(" + ip + ":" + port + ")/"+database+"?charset=utf8"
	return  connection
}

//连接数据库
func InitDataPool() (db *gorm.DB,err error) {
	db, err_db = gorm.Open("mysql", sourceName2(userName,passWord,ip,port,database))

	if err_db != nil {
		log.Fatal(err_db)
		return nil,err_db
	}
	
    log.Print("Mysql start success!")

	defer db.Close()

	return db,nil
}


连接比较简单,直接调用 gorm.Open 传入数据库地址即可
github.com/jinzhu/gorm/dialects/mysql 是 golang 的 mysql 驱动,实际上就是 github.com/go-sql-driver/mysql 作者这里为了好记,重新弄了个名字。
 

3)表定义

type Record struct {
	UserId    int    `gorm:"type:bigint(20);primary_key;AUTO_INCREMENT;not null"`
	TextNum   int  `gorm:"type:bigint(20);not null;"`
	GiftNum   int `gorm:"type:bigint(20);not null;"`
	VoiceNum  int `gorm:"type:bigint(20);not null;"`
	EmotionNum  int `gorm:"type:bigint(20);not null;"`
	EnterTime time.Time `gorm:"type:datetime;not null;"`
	Device     string  `gorm:"type:varchar(255);not null;"`
}

4)创建表

if !db.HasTable(&Record{}) {
    if err := db.Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8").CreateTable(&Record{}).Error; err != nil {
        panic(err)
    }
}
直接通过 db.CreateTable 就可以创建表了,非常方便,还可以通过 db.Set 设置一些额外的表属性
 

5)增删改查

 
//增添数据,先构造已给对象,直接调用 db.Create() 就可以插入一条记录。
Recode:= &Recode{
    UserId:       1,
    TextNum:       34,
    GiftNum:     8,
    VoiceNum:     2,
    EmotionNum:7,
    CreatedAt: time.Now(),
    Device: "ios",
}
 
if err := db.Create(like).Error; err != nil {
    return err
}

//删除数据,先用 db.Where() 构造查询条件,再调用 db.Delete() 就可以删除。
if err := db.Where(&Record{UserId: 1}).Delete(Record{}).Error; err != nil {
    return err
}

//修改数据,先用 db.Model() 选择一个表,再用 db.Update() 更新数据。
db.Model(&Record).Update("UserId", 1)
db.Model(&Record).Updates(User{UserId: 1, GiftNum: 19})

//查询数据,先用 db.Model() 选择一个表,再用 db.Where() 构造查询条件,如果要获取对象,可以使用 db.Find(&Record) 或者只需要查一条记录 db.First(&Record)。
err := db.Model(&Record{}).Where(&Record{UserId:1}).Error
if err != nil {
    return false, err
}

6)事务
 

func CreateAnimals(db *gorm.DB) err {
    tx := db.Begin()
    if err := tx.Create(&Record{UserId:2}).Error; err != nil {
        tx.Rollback()
        return err
    }

    tx.Commit()
    return nil
}

事务的处理也很简单,用 db.Begin() 声明开启事务,结束的时候调用 tx.Commit(),异常的时候调用 tx.Rollback()
 

7)其他

 
还可以使用如下方式设置日志输出级别以及改变日志输出地方,也支持普通的 sql,但是建议尽量不要使用。
db.LogMode(true)
db.SetLogger(gorm.Logger{revel.TRACE})
db.SetLogger(log.New(os.Stdout, "\r\n", 0))

  • 微信扫一扫~
  • 支付宝扫一扫~

很赞哦! ()

文章评论

本站推荐