Go项目中使用gorm创建表以及表的crud 您所在的位置:网站首页 createtable创建表 Go项目中使用gorm创建表以及表的crud

Go项目中使用gorm创建表以及表的crud

2023-03-24 17:36| 来源: 网络整理| 查看: 265

  按照beego官方文档练习ORM的使用,model创建完始终没找到办法创建表,于是使用gorm翻译文档和官方文档进行了练习,使用起来还是比较简单。

  安装:

  方法一:Terminal打开,go get -u github.com/jinzhu/gorm

  方法二:复制地址https://github.com/jinzhu/gorm,到GoLand直接会提示是否将gorm添加到GOPATH,确认添加会自动下载

  建model,models.go内容如下: package models import ( "github.com/jinzhu/gorm" ) type User struct { gorm.Model Name string Profile Profile `gorm:"ForeignKey:UserRefer"` // 一个User包含一个Profile Post []Post // 一个User包含多个Post UserID为外键 } type Profile struct { gorm.Model Age int16 UserRefer uint } type Post struct { gorm.Model Title string UserID uint Tag []*Tag `gorm:"many2many:post_tag;"` } type Tag struct { gorm.Model Name string Posts []*Post `gorm:"many2many:post_tag;"` }   连接数据库,main.go部分内容: package main import ( "fmt" "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" "myproject/models" _ "myproject/routers" ) var db *gorm.DB func main() { // 连接数据库 var err error db, err = gorm.Open("mysql", "root:nola123456@/default?charset=utf8&parseTime=True&loc=Local") if err != nil { panic(err) } defer db.Close() ... }   创建表,main.go部分内容:

  gorm文档给出自动迁移模式,警告:自动迁移仅仅会创建表,缺少列和索引,并且不会改变现有列的类型或删除未使用的列以保护数据。

db.AutoMigrate(&models.User{}, &models.Profile{}, &models.Post{}, &models.Tag{})

  使用如下方式创建表(代码有点繁琐,还在探索中):

func main() { ... // 创建表User if !db.HasTable(&models.User{}) { if err := db.Set("gorm:table_options", "ENGINE=InnoDB").CreateTable(&models.User{}).Error; err != nil { panic(err) } } // 创建表Profile if !db.HasTable(&models.Profile{}) { if err := db.Set("gorm:table_options", "ENGINE=InnoDB").CreateTable(&models.Profile{}).Error; err != nil { panic(err) } } // 创建表Post if !db.HasTable(&models.Post{}) { if err := db.Set("gorm:table_options", "ENGINE=InnoDB").CreateTable(&models.Post{}).Error; err != nil { panic(err) } } // 创建表Tag if !db.HasTable(&models.Tag{}) { if err := db.Set("gorm:table_options", "ENGINE=InnoDB").CreateTable(&models.Tag{}).Error; err != nil { panic(err) } } ... }   运行main.go,数据库表创建完毕:

    

  CRUD,main.go插入部分: func main() { ... // 插入 profile := models.Profile{Age: 30} profile1 := models.Profile{Age: 25} db.Create(&profile) db.Create(&profile1) fmt.Println(profile) fmt.Println(profile1) db.Create(&models.User{Profile: profile, Name: "silence"}) db.Create(&models.User{Profile: profile1, Name: "silence 2"}) db.Create(&models.User{Profile: profile, Name: "nola"}) db.Create(&models.User{Profile: profile1, Name: "alice"}) ... }   CRUD,main.go查询部分: func main() { ... //查询 var count int db.First(&models.User{}) // 第一条记录 db.Last(&models.User{}) // 最后一条记录 db.Find(&models.User{}) // 所有记录 db.First(&models.User{}, 1) // 使用主键获取记录 db.Where("name = ?", "nola").First(&models.User{}) // where条件查询第一个匹配记录 db.Where("name = ?", "nola").Find(&models.User{}) // where条件查询所有匹配记录 db.Where("name ?", "nola").Find(&models.User{}) // where条件查询name不为nola的所有user db.Where("name in (?)", []string{"silence", "silence 2"}) // in db.Where("name LIKE ?", "%sil%").Find(&models.User{}) // LIKE db.Select([]string{"user_refer", "age"}).Find(&models.Profile{}) // 指定检索字段 db.Select("name").Find(&models.User{}) // 指定检索字段 db.Order("name desc").Find(&models.User{}) // 排序 db.Limit(3).Find(&models.User{}) // limit counts := db.Where("name = ?", "rose").Find(&models.User{}).Count(&count) // count fmt.Println(counts) ... }   CRUD,main.go更新部分: func main() { ... // 更新 db.Table("users").Where("id in (?)", []int{30, 34}).Update(map[string]interface{}{"name":"hello"}) // 批量更新 affected_nums := db.Model(&models.User{}).Where("name = ?", "jack").Update(models.User{Name:"jim"}).RowsAffected // 返回影响行数 fmt.Println(affected_nums) ... }   CRUD,main.go删除部分: func main() { ... // 删除 db.Where("name LIKE ?", "%len%").Delete(models.User{}) db.Delete(models.Profile{}, "age = ?", "30") // model存在deleted_at字段为软删除 记录删除时间 fmt.Println(db.Where("age = ?", "30").Find(&models.Profile{}).Value) // 软删除的记录查询被忽略 fmt.Println(db.Unscoped().Where("age = ?", "30").Find(&models.Profile{}).Value) // 查询软删除的记录 db.Unscoped().Delete(models.Profile{}, "age = ?", "30") // 永久删除记录 }

  

  习惯Django那种建好model进行迁移,也有一些人习惯利用sql语句去生成models.go文件,个人感觉很别扭。gorm使用起来很舒服,它还有很多高级用法,值得慢慢研究。。。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有