项目地址:https://github.com/jinzhu/gorm
文档地址:https://godoc.org/github.com/jinzhu/gorm

库安装

  1. go get github.com/jinzhu/gorm

如果因为网络原因不能安装,可以设置代理。比如在Windows下

  1. set GOPROXY=http://goproxy.cn

数据库连接

gorm支持多种数据库连接,这里以Mysql为例

  1. import (
  2. "github.com/jinzhu/gorm"
  3. _ "github.com/jinzhu/gorm/dialects/mysql"
  4. var db *gorm.DB
  5. func init() {
  6. var err error
  7. db, err = gorm.Open("mysql", "<user>:<password>/<database>?charset=utf8&parseTime=True&loc=Local")
  8. if err != nil {
  9. panic(err)
  10. }
  11. }

或者

  1. package common
  2. import (
  3. "fmt"
  4. "github.com/jinzhu/gorm"
  5. _ "github.com/jinzhu/gorm/dialects/mysql"
  6. "log"
  7. )
  8. var db *gorm.DB
  9. // 初始化数据库
  10. func InitDB() *gorm.DB {
  11. driverName := "mysql"
  12. host := "localhost"
  13. port := "3306"
  14. username := "root"
  15. password := "coolops"
  16. dbName := "my_user"
  17. charSet := "utf8"
  18. args := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=True&loc=Local",
  19. username, password, host,port,dbName, charSet,
  20. )
  21. db, err := gorm.Open(driverName, args)
  22. if err != nil {
  23. log.Println("connect to MySQL failed. err " + err.Error())
  24. }
  25. }

数据库的连接比较简单,直接使用gorm.Open()即可。

数据库操作

表定义

  1. type User struct {
  2. gorm.Model
  3. UserName string `gorm:"varchar(20);not null"`
  4. PassWord string `gorm:"size 255;not null"`
  5. Telephone string `gorm:"varchar(11);not null;unique"`
  6. }

gorm用tag的方式来标识MySQL里面的约束。

创建表

支持自动创建,也支持手动创建。

自动创建
  1. db.AutoMigrate(&User{})

会创建一张以users的表。

手动创建
  1. if !db.HasTable(&Like{}) {
  2. if err := db.Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8").CreateTable(&User{}).Error; err != nil {
  3. panic(err)
  4. }
  5. }

插入数据

  1. user := &User{
  2. UserName: name,
  3. Password: password,
  4. Telephone: telephone,
  5. }
  6. if err := db.Create(user).Error; err != nil{
  7. return err
  8. }

删除数据

  1. if err := db.Where(&User{Telephone: telephone}).Delete(User{}).Error; err != nil {
  2. return err
  3. }

查询数据

  1. if err := db.Model(&User{}).Where("telephone = ?", telephone).First(&user); err != nil {
  2. return err
  3. }

先用 db.Model() 选择一个表,再用 db.Where() 构造查询条件,db.First(&user)只取第一条记录。

修改数据

  1. db.Model(&user).Update("name", "hello")
  2. db.Model(&user).Updates(User{Name: "hello", Age: 18})
  3. db.Model(&user).Updates(User{Name: "", Age: 0, Actived: false}) // nothing update

事务操作

  1. func CreateAnimals(db *gorm.DB) err {
  2. tx := db.Begin()
  3. if err := tx.Create(&Animal{Name: "Giraffe"}).Error; err != nil {
  4. tx.Rollback()
  5. return err
  6. }
  7. if err := tx.Create(&Animal{Name: "Lion"}).Error; err != nil {
  8. tx.Rollback()
  9. return err
  10. }
  11. tx.Commit()
  12. return nil
  13. }

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