按照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使用起来很舒服,它还有很多高级用法,值得慢慢研究。。。


  着实不甘心,beego的orm连注册model都有,怎能没有创建同步表呢?参考csdn上一篇文章,再试一下:

  创建项目:cd src工作间 - bee new useBeegoORM创建项目

  useBeegoORM/models/models.go内容如下:

package models

type User struct {
Id int
Name string
Profile *Profile `orm:"rel(one)"` // 一对一关系
Post []*Post `orm:"reverse(many)"` // 设置一对多反向关系
} type Profile struct {
Id int
Age int16
User *User `orm:"reverse(one)"` // 设置一对一反向关系(可选)
} type Post struct {
Id int
Title string
User *User `orm:"rel(fk)"` // 设置一对多关系
Tags []*Tag `orm:"rel(m2m)"` // 设置多对多关系
} type Tag struct {
Id int
Name string
Posts []*Post `orm:"reverse(many)"`
}

  useBeegoORM/main.go内容如下:

package main

import (
_ "github.com/Go-SQL-Driver/MySQL" // 引入driver
"github.com/astaxie/beego"
"github.com/astaxie/beego/orm" "useBeegoORM/models" // 引入model
_ "useBeegoORM/routers"
) func init() {
// 注册driver
orm.RegisterDriver("mysql", orm.DRMySQL) // 需要在init中注册定义的model
orm.RegisterModel(new(models.User), new(models.Profile), new(models.Post), new(models.Tag)) // 注册数据库 ORM必须注册一个别名为default的数据库作为默认使用
orm.RegisterDataBase("default", "mysql", "root:nola123456@/orm_test?charset=utf8") // 自动创建表 参数二开启创建表 参数三开启更新表【此句重点】
orm.RunSyncdb("default", true, true)
} func main() {
beego.Run()
}

  运行会自动创建表,同步到数据库,效果如下:

  创建的表终于同步到数据库了~。~

  接着看看CRUD的使用:

  

package main

import (
_ "github.com/Go-SQL-Driver/MySQL" // 引入driver
//"github.com/astaxie/beego"
"github.com/astaxie/beego/orm" "fmt"
"useBeegoORM/models" // 引入model
_ "useBeegoORM/routers"
) func init() {
// 注册driver
orm.RegisterDriver("mysql", orm.DRMySQL) // 需要在init中注册定义的model
orm.RegisterModel(new(models.User), new(models.Profile), new(models.Post), new(models.Tag)) // 注册数据库 ORM必须注册一个别名为default的数据库作为默认使用
orm.RegisterDataBase("default", "mysql", "root:nola123456@/orm_test?charset=utf8") // 自动创建表 参数二开启创建表 参数三开启更新表【此句重点】
//orm.RunSyncdb("default", true, true)
} func main() {
// 对象的CRUD
o := orm.NewOrm() // 创建一个Ormer
user := new(models.User)
profile := new(models.Profile)
profile.Age = 30
user.Name = "silence"
user.Profile = profile
fmt.Println(o.Insert(user)) // Insert
fmt.Println(o.Insert(profile)) user.Name = "Your"
fmt.Println(o.Update(user)) // Update
fmt.Println(o.Read(user)) // Read
fmt.Println(o.Delete(user)) // Delete
//beego.Run()
}

  查看数据:

  可增减数据,第2步submit,相应的会打印console。

  ORM的操作还需慢慢研究。有关GoLand配置数据库以及配置远程host,用过jetbrains公司的产品如PyCharm等,配置风格都类似。

  明天有时间写个详细步骤留存,供大家参考~

Go项目中beego的orm使用和gorm的使用的更多相关文章

  1. .Net Core ORM选择之路,哪个才适合你 通用查询类封装之Mongodb篇 Snowflake(雪花算法)的JavaScript实现 【开发记录】如何在B/S项目中使用中国天气的实时天气功能 【开发记录】微信小游戏开发入门——俄罗斯方块

    .Net Core ORM选择之路,哪个才适合你   因为老板的一句话公司项目需要迁移到.Net Core ,但是以前同事用的ORM不支持.Net Core 开发过程也遇到了各种坑,插入条数多了也特别 ...

  2. 简单ORM工具的设计和编写,自己项目中曾经用过的

    http://www.cnblogs.com/szp1118/archive/2011/03/30/ORM.html 在之前的一个项目中自己编写了一个简单的ORM小工具,这次重新整理和重构了一下代码, ...

  3. 使用 Django 项目中的 ORM 编写伪造测试数据脚本

    作者:HelloGitHub-追梦人物 文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 为了防止博客首页展示的文章过多以及提升加载速度,可以对文章列表进行分页展示.不过这需 ...

  4. ORM Nhibernate框架在项目中的配置

    在项目中使用 Nhibernet 时,一定要将 配置文件 .xml  编译方式设置为 嵌入式资源,否则在运行项目时就会出现错误. 以下是hibernate.cfg.xml 的配置,在配置中使用的是 M ...

  5. java 项目中几种O实体类的概念

    经常会接触到vo,do,dto的概念,本文从领域建模中的实体划分和项目中的实际应用情况两个角度,对这几个概念进行简析. 得出的主要结论是:在项目应用中,vo对应于页面上需要显示的数据(表单),do对应 ...

  6. MongoDB在实际项目中的使用

    MongoDB简介 MongoDB是近些年来流行起来的NoSql的代表,和传统数据库最大的区别是支持文档型数据库. 当然,现在的一些数据库通过自定义复合类型,可变长数组等手段也可以模拟文档型数据库. ...

  7. 项目中的web api知识总结

    最近在做公司的项目,自己负责webapi的框架的搭建与开发,最近很忙,一直没时间对工作中遇到的知识点缺少个总结,现总结一下,对自己是个提升,如果个人的小点点小总结能对博友有帮助那也是善莫大焉. (1) ...

  8. Atitit.mybatis的测试  以及spring与mybatis在本项目中的集成配置说明

    Atitit.mybatis的测试  以及spring与mybatis在本项目中的集成配置说明 1.1. Mybatis invoke1 1.2. Spring的数据源配置2 1.3. Mybatis ...

  9. WPF Step By Step 系列-Prism框架在项目中使用

    WPF Step By Step 系列-Prism框架在项目中使用 回顾 上一篇,我们介绍了关于控件模板的用法,本节我们将继续说明WPF更加实用的内容,在大型的项目中如何使用Prism框架,并给予Pr ...

随机推荐

  1. centos6/7破解root密码的操作

    Centos 6 1.开机按“Esc”键 2.按e键进入编辑模式后,选择Kernel /vmlinuz-2.6.92......项 3.进入该编辑模式后,在quiet后面输入simple或者数字1后, ...

  2. OLTP和OLAP的区别

    OLTP和OLAP的区别 联机事务处理OLTP(on-line transaction processing) 主要是执行基本日常的事务处理,比如数据库记录的增删查改.比如在银行的一笔交易记录,就是一 ...

  3. source insight 4.0.86.0 安装过程中出现的问题

    1.sourceinsight_4.0.86.0-setup.exe 2.sourceinsight4.exe覆盖安装目录中的sourceinsight4.exe 3.导入lic文件 过程中360会将 ...

  4. 网页静态化技术--Freemarker入门

    网页静态化技术:为什么要使用网页静态化技术 网页静态化解决方案在实际开发中运用比较多,例如新闻网站,门户网站中的新闻频道或者是文章类的频道. 对于电商网站的商品详细页来说,至少几百万个商品,每个商品又 ...

  5. postgresql开启网络连接

    默认情况下,postgresql是只允许localhost连接的,如果需要使用远程连接,需要修改两个配置文件. postgresql.conf 和 pg_hba.conf 在postgresql.co ...

  6. linux系统ansible一键完成三大服务器基础配置(剧本)

    ansible自动化管理剧本方式一键完成三大服务器基础配置 环境准备:五台服务器:管理机m01:172.16.1.61,两台web服务器172.16.1.7,172.16.1.8,nfs存储服务器17 ...

  7. day18

    使用规范目录结构的好处 - 使项目结构更清晰 - 提高可读性 规范目录结构不是固定,可以根据实际需求进行添加修改 常见目录如下: bin 存放执行文件 conf 存放配置文件 core 存放核心业务逻 ...

  8. shell编程(六)之数组

    数组: 存储多个元素的连续的内存空间 索引: 编号从0开始,属于数值索引 注意:索引也可支持使用自定义的格式,而不仅仅是数值格式 声明数组: declare -a ARRAY_NAME declare ...

  9. python中模块的__all__详细使用

    python模块中的__all__,用于模块导入时限制,如:from module import * 此时被导入模块若定义了__all__属性,则只有__all__内指定的属性.方法.类可被导入:若没 ...

  10. _spellmod_aura_pct

    属性光环 为玩家增加光环或降低属性 `aura`光环ID `auraType1` 配置属性('空','生命值','全属性','近战攻击强度','远程攻击强度','法术强度','治疗效果','施法速度' ...