Gorm操作数据库

* 本页面总结凯冰音乐APP项目Gorm操作数据库的相关内容。

本次项目MySQL数据库操作采用的类库是GORM的最新版本V1.20.12,它是一个神奇的,对开发人员友好的 Golang ORM 库。官方地址: https://gorm.io/

GORM
GORM
什么是ORM?

ORM 全称 Object Relation Mapping 对象映射关系,目的是解决面向对象和关系数据库之间存在的互不匹配的现象。

sql注入曾经是一种常见的网络攻击方式,针对程序编写疏忽而产生的问题比如:通过sql语句实现无账号登录、删除甚至篡改数据库。

orm就很好的解决了这些问题,在其底层逻辑中会带有转义操作,不担心注入问题,而且对于我们的struct结构体而言,也提供了对应关系操作,对于编程者来说是极大地便利:将注意力从数据库的细节转移到业务逻辑上。orm作为中间层,可以简化数据库的迁移操作。

当然,orm也是有缺点的:不能够生成所有的sql业务语句,有些复杂的还是需要sql原生语句操作;性能低于直接使用sql语句的。

什么是GORM?

GORM就是Go语言版本实现的ORM,官方定义是:

The fantastic ORM library for Golang aims to be developer friendly.

GORM使用方式

安装之后,导入包即可

  //安装
  go get -u gorm.io/gorm
  go get -u gorm.io/driver/sqlite

  //使用
  import (
    "gorm.io/gorm"
    "gorm.io/driver/sqlite"
  )

  dbName := config.GetString("zkbhj_db.name")
  user := config.GetString("zkbhj_db.user")
  port := config.GetInt("zkbhj_db.port")
  password := config.GetString("zkbhj_db.password")
  host := config.GetString("zkbhj_db.host")

  dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", user, password, host, port, dbName)
  if db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}); err != nil {
    panic(err)
  } else {
    MusicDB = db
  }
GORM更多使用方式
  //创建表
  //CREATE TABLE users( name VARCHAR(50), age INT);
  type User struct{
    name stringg
    age int
  }
  db.Table(“users”).CreateTable(&User{})

  //插入数据
  //INSERT INTO users (name, age) VALUES ('ee','18');
  user := User{
    name : "ee",
    age : 18,
  }
  db.Create(&user)

  //查询数据
  //SELECT * FROM users WHERE name="ee";
  var users [ ]User//定义一个User类型的数组名字叫做users

  db.Where(“name=?”,”ee”).Find(&users)  //方法1:查询所有结果放入users数组
  db.Where(&User{name:”ee”,age:18}).Find(&users)
  db.Where(map[string] interface{}{"name":"ee","age":18}).Find(&users)

  //读取第1条
  //SELECT * FROM users WHERE name="ee" limit 1;
  var user User 
  db.Where("name=?","ee").First(&user)

  //LIMIT多条
  //SELECT * FROM users LIMIT 3;
  var users [ ]User
  db.Limit(3).Find(&users)

  //LIKE AND IN
  //SELECT * FROM users WHERE role='admin' OR role ='super_admin';
  db.Where("role=?","admin”).Or("ole=?",super_admin").Find(&users)
  db.Where("name LIKE ?","%ee%").Find(&user)
  db.Where("name=? AND age>=?”, "ee", "18").Find(&users)
  db.Where("name in (?)",[ ]string{"ee","sh"}).Find(&usere)

  //部分字段和排序
  db.Select(“name, age”).Find(&users)
  db.Select([ ]string{“name”,”age”}).Find(&users)
  db.Order("age desc").Order("name").Find(&users)

  //数据记录数
  //SELECT count(*) FROM users WHERE name ='ee';
  var count int
  db.Where("name=?","ee").Count(&count)

  //数据更新
  //UPDATE users SET name='hello' WHERE id=111;
  var user User

  db.Where("id=?", "111").First(&user)
  Db.Model(&user).Update("name","hello")
  db.Model(&user).Updates(map[string]interface{}{“name”:”hello”,”age”:18})
  db.Model(&user).Update(User{name:"hello",age:18})

  //删除
  //DELETE FROM users WHERE id=10;
  var user User 
  db.Where("id=?","10").First(&user)
  db.Delete(&user)

gorm支持事务,不过是需要我们自己来简单的实现一些,假如说我们的事务是三步,我们要做的操作是:

  // 开始事务
  tx := db.Begin()

  // 在事务中执行一些 db 操作(从这里开始,您应该使用 'tx' 而不是 'db')
  tx.Create(...)

  // ...

  // 遇到错误时回滚事务
  tx.Rollback()

  // 否则,提交事务
  tx.Commit()
  db.Transaction(func(tx *gorm.DB) error {
    // 在事务中执行一些 db 操作(从这里开始,您应该使用 'tx' 而不是 'db')
    if err := tx.Create(&Animal{Name: "Giraffe"}).Error; err != nil {
      // 返回任何错误都会回滚事务
      return err
    }

    if err := tx.Create(&Animal{Name: "Lion"}).Error; err != nil {
      return err
    }

    // 返回 nil 提交事务
    return nil
  })

如果你的项目简单,没有使用事务的场景,可以在初始化时禁用它,这将获得大约 30%+ 性能提升

  // 全局禁用
  db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{
    SkipDefaultTransaction: true,
  })

  // 持续会话模式
  tx := db.Session(&Session{SkipDefaultTransaction: true})
  tx.First(&user, 1)
  tx.Find(&users)
  tx.Model(&user).Update("Age", 18)

GORM的知识就总结到这里吧,以后接触更多的再更新,你都学会(废)了吗?


* 本页内容参考以下数据源:

  • https://gorm.io/
  • https://www.jianshu.com/p/f1f9bbcff4dc
  • https://my.oschina.net/tplinuxhyh/blog/4684067

凯冰科技 · 代码改变世界,技术改变生活
下一篇:各种后台问题笔记 →