范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Go语言Gorm框架学习笔记

  Gorm是Go语言的一个orm框架,类似Java中的JPA的实现(Hibernate、EclipseLink等)。 本文目的
  本文就是按照官网官方说明,自己动手尝试下,增加记忆,仅此而已。 安装
  进入项目目录安装gorm ➜  Go-Gorm-Notes git:(main) ✗ go get -u gorm.io/gorm go: added github.com/jinzhu/inflection v1.0.0 go: added github.com/jinzhu/now v1.1.5 go: added gorm.io/gorm v1.23.10
  我用的数据库是mysql,所以还需要引入Mysql驱动 ➜  Go-Gorm-Notes git:(main) ✗ go get -u gorm.io/driver/mysql go: added github.com/go-sql-driver/mysql v1.6.0 go: added gorm.io/driver/mysql v1.3.6创建连接
  下面代码是创建一个Mysql的gorm.DB,之后的操作都要使用这个DB。 package models  import ( 	"gorm.io/driver/mysql" 	"gorm.io/gorm" )  var Db = initDb()  //初始化数据库连接 func initDb() *gorm.DB { 	// Mysql的链接字符串,我电脑上用户名是root,密码是qwe!@#123 	dsn := "root:qwe!@#123@tcp(127.0.0.1:3306)/go-gorm?charset=utf8mb4&parseTime=True&loc=Local" 	// Mysql驱动有自己的配置选项,可以通过 mysql.New(mysql.Config{})配置。具体可看mysql.Config。 	Db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{}) 	return Db } Model
  对于这种ORM框架,Model是特别重要的,也是值得去深入学习的地方,因为一个小问题,可能就会引发数据库的问题。 初识
  我会创建一个简单的Model,并使用gorm的自动创建数据库表功能,来看看如何做到通过Model自动创建表。
  创建一个Author结构体 package models  import "gorm.io/gorm"  type Author struct { 	gorm.Model 	Name string }
  main方法中使用来自动创建数据库表 package main  import "Go-Gorm-Notes/models"  func main() { 	// 使用AutoMigrate自动创建数据库表 	models.Db.AutoMigrate(&models.Author{}) }
  运行后会发现数据库中多了一个叫做authors的表。请注意这个名字,这是gorm自动创建的,能否自己指定呢?肯定是可以的,看下自动创建的表的结构如下: create table authors (     id         bigint unsigned auto_increment         primary key,     created_at datetime(3) null,     updated_at datetime(3) null,     deleted_at datetime(3) null,     name       longtext    null );  create index idx_authors_deleted_at     on authors (deleted_at);
  说明:id,created_at,updated_at,deleted_at都是因为Author结构体继承了gorm.Model。这是gorm自身提供的,我们也可以不使用它,如果不用就要自己定义主键字段。
  另外name字段是自己加的,但是name字段的类型是longtext,这可能不是我们想要的,我们可能想要的是name是varchar(200)这样的类型,也是可以自定义的。官网都有说明,接下来我一一尝试下,并记录下来。 自定义表名
  自定义表名需要实现gorm.schema下的TableName方法。 package models  import "gorm.io/gorm"  type Author struct { 	gorm.Model 	Name string }  // TableName 自定义表名 func (Author) TableName() string  { 	return "author" }
  重新运行看看是否会自动创建author表
  模型定义字段标签
  可以在结构体字段名后面使用gorm:xxx的机构来配置标签,从而达到自定义数据库列信息的效果。
  声明 model 时,tag 是可选的,GORM 支持以下 tag: tag 名大小写不敏感,但建议使用 camelCase 风格
  标签名
  说明
  column
  指定 db 列名
  type
  列数据类型,推荐使用兼容性好的通用类型,例如:所有数据库都支持 bool、int、uint、float、string、time、bytes 并且可以和其他标签一起使用,例如:not null、size, autoIncrement… 像 varbinary(8) 这样指定数据库数据类型也是支持的。在使用指定数据库数据类型时,它需要是完整的数据库数据类型,如:MEDIUMINT UNSIGNED not NULL AUTO_INCREMENT
  serializer
  指定将数据序列化或反序列化到数据库中的序列化器, 例如: serializer:json/gob/unixtime
  size
  定义列数据类型的大小或长度,例如 size: 256
  primaryKey
  将列定义为主键
  unique
  将列定义为唯一键
  default
  定义列的默认值
  precision
  specifies column precision
  scale
  specifies column scale
  not null
  specifies column as NOT NULL
  autoIncrement
  specifies column auto incrementable
  autoIncrementIncrement
  auto increment step, controls the interval between successive column values
  embedded
  embed the field
  embeddedPrefix
  column name prefix for embedded fields
  autoCreateTime
  track current time when creating, for int fields, it will track unix seconds, use value nano/milli to track unix nano/milli seconds, e.g: autoCreateTime:nano
  autoUpdateTime
  track current time when creating/updating, for int fields, it will track unix seconds, use value nano/milli to track unix nano/milli seconds, e.g: autoUpdateTime:milli
  index
  create index with options, use same name for multiple fields creates composite indexes, refer Indexes for details
  uniqueIndex
  same as index, but create uniqued index
  check
  creates check constraint, eg: check:age > 13, refer Constraints
  <-
  set field’s write permission, <-:create create-only field, <-:update update-only field, <-:false no write permission, <- create and update permission
  ->
  set field’s read permission, ->:false no read permission
  -
  ignore this field, - no read/write permission, -:migration no migrate permission, -:all no read/write/migrate permission
  comment
  add comment for field when migration column
  定义列的名字,比如如下代码将Name字段对应的数据库列名为t_name。 Name string `gorm:"column:t_name"`type
  列数据类型,推荐使用兼容性好的通用类型,例如:所有数据库都支持 bool、int、uint、float、string、time、bytes 并且可以和其他标签一起使用,例如:not null、size, autoIncrement… 像 varbinary(8) 这样指定数据库数据类型也是支持的。在使用指定数据库数据类型时,它需要是完整的数据库数据类型,如:MEDIUMINT UNSIGNED not NULL AUTO_INCREMENT
  比如我继续设置Name字段为varchar(200) not null default "" Name string `gorm:"column:name;type:varchar(200) not null default """`
  可以看到类型等信息已经正确设置。 size
  定义列数据类型的大小或长度,例如 size: 256 Sex  string `gorm:"size:10"`
  这里我没有使用name字段,是因为Name字段制定了type,类型varchar(200),再指定size无效。 primarykey
  上面的结构体我使用了gorm.Model,gorm自动给我生成了主键,现在我要自己定义主键,重新定义下结构体 package models  type Author struct { 	ID   uint   `gorm:"primarykey"` 	Name string `gorm:"column:name;type:varchar(200) not null default "";"` 	Sex  string `gorm:"size:10"` }  // TableName 自定义表名 func (Author) TableName() string { 	return "author" }
  我使用 ID   uint   `gorm:"primarykey"`
  定义ID是主键。
  unique
  使用unique就会设置唯一索引。 Name string `gorm:"column:name;type:varchar(200) not null default "";unique"`
  结果如下:
  default
  设置默认值 Sex  string `gorm:"size:10;default:"男""`
  indexName string `gorm:"column:name;type:varchar(200) not null default "";index"`
  创建了一个普通索引。 uniqueIndex
  创建唯一索引 // 身份信息唯一 Identify string `gorm:"size:100;uniqueIndex"`
  需要注意的是上面的size:100;不能去掉,使用它可以是数据库类型变为varchar,否则类型是longtext,这个类似不能加唯一索引的。会报错。
  not null
  指定列不能为空 Identify string `gorm:"size:100;uniqueIndex;not null;"`
  autoCreateTime
  创建记录时自动填充时间,取值nano或者milli。
  插入一条记录 models.Db.Save(&models.Author{Name: "张飞", Identify: "001"})
  结果是:
  id
  name
  sex
  identify
  ct_time_nano
  ct_time_milli
  ct_nano
  ct_milli
  1
  张飞   男   001
  2022-10-07 12:11:47.854   2022-10-07 12:11:47.854   1665115907854000000
  1665115907854 autoUpdateTime   跟autoCreateTime类似。 embedded   内嵌字段,将一个结构体嵌入进来 package models import "time" type Author struct { ID uint `gorm:"primarykey"` Name string `gorm:"column:name;type:varchar(200) not null default "";index"` Sex string `gorm:"size:10;default:"男""` // 身份信息唯一 Identify string `gorm:"size:100;uniqueIndex;not null;"` CtTimeNano time.Time `gorm:"autoCreateTime:nano"` //nano/milli CtTimeMilli time.Time `gorm:"autoCreateTime:milli"` CtNano int `gorm:"autoCreateTime:nano"` CtMilli int `gorm:"autoCreateTime:milli"` ConcatWay `gorm:"embedded"` } // ConcatWay 联系方式 type ConcatWay struct { Address string Phone string Email string } // TableName 自定义表名 func (Author) TableName() string { return "author" }   运行AutoMigrate后,数据库表结构如下   增加了Address结构体下的字段。 embeddedPrefix   对于内嵌的结构体字段,增加前缀,默认是空 ConcatWay `gorm:"embedded;embeddedPrefix:cw_"`   comment   字段的备注信息 ID uint `gorm:"primarykey;comment:主键ID"`   serializer   指定将数据序列化或反序列化到数据库中的序列化器, 例如: serializer:json/gob/unixtime ByteJson []byte `gorm:"serializer:json"` ConcatWayJSON ConcatWay `gorm:"serializer:json"` ConcatWayGob ConcatWay `gorm:"serializer:gob"` TimeUnixtime int64 `gorm:"serializer:unixtime;type:time"` //将int64的内容转化为ddatetime存储   存储一条数据 models.Db.Create(&models.Author{ Name: "张飞", Identify: "001", ByteJson: []byte("字节切片"), ConcatWayJSON: models.ConcatWay{Address: "https://itlab1024.com", Email: "itlab1024@163.com"}, ConcatWayGob: models.ConcatWay{Address: "https://itlab1024.com", Email: "itlab1024@163.com"}, TimeUnixtime: 12, })   id   name   sex   identify   ct_time_nano   ct_time_milli   ct_nano   ct_milli   cw_address   cw_phone   cw_email   byte_json   concat_way_json   concat_way_gob   time_unixtime   1
  张飞   男   001
  2022-10-07 14:27:01.859   2022-10-07 14:27:01.859   1665124021859000000
  1665124021859
  "5a2X6IqC5YiH54mH"   {"Address":"https://itlab1024.com","Phone":"","Email":"itlab1024@163.com"}   0x37FF8103010109436F6E63617457617901FF82000103010741646472657373010C00010550686F6E65010C000105456D61696C010C0000002DFF82011568747470733A2F2F69746C6162313032342E636F6D021169746C616231303234403136332E636F6D00   1970-01-01 08:00:12 autoIncrement   设置列自增,需要与type标签联合使用 autoIncrementIncrement   设置列自增步长,需要与type标签联合使用 unique   设置唯一键 check   设置约束,比如设置name的值不能等于abc Name string `gorm:"check:name <> "abc""`关联Belongs To   belongs to 会与另一个模型建立了一对一的连接。 这种模型的每一个实例都"属于"另一个模型的一个实例。就是谁属于谁,比如一个人属于一个国家。   看如下如下两个结构体User和Country package models import "gorm.io/gorm" type User struct { gorm.Model Name string CountryId uint // 这里不能使用匿名 Country Country } type Country struct { *gorm.Model Name string }   自动创建表后,可以得到如下结构   用户表的country_id和country表的id关联了起来。一对一的关系。 Has One   has one 与另一个模型建立一对一的关联,但它和一对一关系有些许不同。 这种关联表明一个模型的每个实例都包含或拥有另一个模型的一个实例。   例如,您的应用包含 user 和 credit card 模型,且每个 user 只能有一张 credit card。 // User 有一张 CreditCard,UserID 是外键 type User struct { gorm.Model CreditCard CreditCard } type CreditCard struct { gorm.Model Number string UserID uint }   可以看到users表没有credit的相关字段。   再看下credit_cards表   该表的userId关联到了user表的ID字段。 Has Many   类似于has one,只不过这里要使用的是切片 // User 有多张 CreditCard,UserID 是外键 type User struct { gorm.Model CreditCards []CreditCard } type CreditCard struct { gorm.Model Number string UserID uint }   创建出来的表如下:   users表:   credit_cards表如下:   跟has one创建的表结构是一样的。 Many To Many   Many to Many 会在两个 model 中添加一张连接表,可以通过标签many2manay设置关联表的名字。 // User 拥有并属于多种 language,`user_languages` 是连接表 type User struct { gorm.Model Languages []Language `gorm:"many2many:user_languages;"` } type Language struct { gorm.Model Name string }   会创建user_languages中间表,并且关联表中的user_id跟User表的ID关联,language_id跟languages表的id关联。   上面的都是使用默认的情况,比如外键名称等,如果想更换名字等信息,就得重写外键,这里我就一一说明了。 原生SQL   待更新...

找到你的影子(梅花3)轰隆!天空乌云密布,闪电如雷蛇一般穿梭在云层间。在雷光的缝隙间,一个影子矗立在山巅上,全身被破布覆盖着,身上的伤痕仿佛在诉说着他一路走得多么的艰难。他慢慢抬起头,灰白的眼睛里的迷茫iOS16B1第一个公测版正式发布,更新修复了这些东西在凌晨时分苹果发布了第一个公测版本,这意味着普通群众也可以大胆的更新iOS16了,公测版本相对于开发者测试版本稳定很多,Bug也会少很多,小编第一时间更新了公测版本,发现以下改进和有蹊跷!最菜刺客对最强女保镖,安倍怎么就交代了?仔细想想,安倍有点冤。这位前日本首相,出身高贵身材高大长相英俊很有女人缘。这次在安保人员的簇拥下,竟被人一骑讨,轻易就交代了。怎么看,都像是假新闻。再认真研究下,刺客的水平也很一般一瓶冷饮引发的心血管事件运动后猛喝冰水突发心梗大汗淋漓后一瓶冷饮下肚,可能是很多人眼里痛快的消暑方式。而这种夏日常见的做法,也可能让血管瞬间崩溃近日,福建福州一19岁男生在打完篮球后猛喝冰饮,一口气喝完后不到五分钟,就开始感到OK!SERIESHEARTSURGEONS关于唐医生的一切剧照,秦岚饰演心外科医生唐佳瑜医疗剧,我们并不陌生。美剧有经典的良医豪斯医生实习医生格蕾,日剧有白色巨塔和非自然死亡,港剧的妙手仁心至今还简直丧心病狂!江苏泰州一地下车库内,6人连踢带踹辱骂女孩近日,一则发生在江苏泰州的视频在网上疯传,6人连踢带踹,在某商场的地下车库内打骂女孩,双方究竟是什么关系?在光天化日之下,他们如何敢如此暴力对待他人?连踢带踹撕衣服,围殴女孩从网传虚假贷款材料一路绿灯!湖南洪江农商行一支行行长违法放贷200万元获刑一年金融界7月12日消息近日,湖南省洪江农商行一支行行长因犯违法发放贷款罪被判刑。根据湖南省洪江市人民法院刑事判决书,被告人傅某出生于1976年,大专文化,在职期间任洪江农商行龙田支行超模何穗自曝成功美黑!酒店内晒涂鸦泳装照长腿吸睛,曾白到发光饿了吗?戳右边关注我们,每天给您送上最新出炉的娱乐硬核大餐!7月12日,维密超模何穗突然宣布了一个令人意外的消息,她发文称这美黑算成功吧!从此是辣妹啊!从何穗的语气里能感受到,她对驻日记者曾颖,在直播中哭丧安倍被网暴,本人回应我有什么错?驻日记者曾颖也是出名了。安倍被暗杀,曾颖出名。发生了什么事?曾颖在日本生活了12年,对日本的一切都很熟悉。安倍晋三被谋杀后,澎湃新闻通过网络联系了曾颖,询问了情况。曾颖一边说话一边2019年,67岁大妈怀孕生女,声称工资过万不会麻烦子女,现在怎么样了?看到这组照片,你的第一反应是什么?想必大部分人的第一感觉都是爷爷奶奶带娃照。其实不是。照片里的两位老人,并不是孩子的爷爷奶奶,而是亲生父母。不知道是否有人记得2019年的一则热搜山澳媒炒作所罗门给中方援助人员发签证,不给澳方发文观察者网王世纯澳大利亚方面继续炒作所罗门群岛问题,这一次他们盯上了签证。澳大利亚人报11日报道称,所罗门群岛拒绝向5名澳大利亚顾问发放签证,却根据其与中国签署的安全协议,批准至少
525万,回归湖人!紫金军又一溢价合同,詹姆斯无法拯救你的生涯早些时候,爵士和骑士完成了一笔震惊联盟的8换1大交易,爵士顺利送走了米切尔,他们从骑士得到了塞克斯顿马尔卡宁阿巴基以及5个首轮选秀权(3个首轮签2个首轮签互换),这笔交易达成之后,2022年9月19日新闻简报,工作愉快正文共908字预计阅读时间3分钟码字不易,如果有用,请记得支持点赞关注转发!美好的一天,从读报开始,9月19日,壬寅年八月廿四,星期一,周末愉快,幸福生活1印度首富成世界第2富豪刷穆里尼奥像极了生二胎后安慰老大塔米做的工作,比进球还重要虽然是属于小魔仙迪巴拉的夜晚,他还给白头发老头行了吻手礼,同时也是红贝贝在六万多名罗马球迷跟前的亮相,老穆还专门打圆场,让贝洛蒂上场,是奖励他为了加盟罗马,而付出的努力,以及等待罗霍华德愿260万底薪签76人哈登不欢迎篮网计划给他合同辅杜兰特费城询问报记者斯基庞培最新报道,德怀特霍华德有意以老将底薪合同签约76人队,再次出任乔尔恩比德的替补,可詹姆斯哈登似乎并不欢迎这名三届最佳防守队员来到球队。哈登降薪续约后,76人队夏决垃圾话,阿水没人能真正意义上压制我,Viper可否一战?相信兄弟们都已经知道了,在上周滔搏就已经30EDG成功挺进夏决,而在昨天滔搏和京东按照流程开了一场新闻发布会为决赛造势。熟悉LPL的兄弟们这个阶段一般都是垃圾话时间,滔搏和京东也确邦奇威尔斯10年职业生涯签了3份合同,吃饭睡觉打邓肯邦奇威尔斯,职业生涯始于开拓者邦奇威尔斯1976年出生于美国印第安纳州,1998年第11顺位被活塞队选中,但随后被交易至开拓者队,10年职业生涯效力过开拓者灰熊国王火箭和黄蜂队,由欧锦赛的第一控卫施罗德为何如今还没找到工作到底有何玄机当下最炙手可热的篮球比赛非男篮欧锦赛莫属,在法国德国波兰和西班牙作为四强将竞争最后的总冠军。在塞尔维亚希腊和斯洛文尼亚先后被淘汰出局,NBA在欧锦赛中的一线球星,东契奇约基奇和字母不管是工作还是生活中,遇到以下4种人,要趁早远离你好呀,我是你们的李姑娘欢迎关注我,我们一起感悟人生!一个人生活在这个世界上,无论是工作还是生活中,都免不了和人打交道。人这一生会和形形色色的人打交道,有和自己志趣相投的人,也有和两性之间,一旦有了爱的关系后,女人一辈子都忘不掉了爱情是什么,幸福是什么,我们定义不一样,我们看法也是不一样的,我们理解的更多,但是我们可以去感触感动的更少,这就是生活的定义,生活的价值。重要的是我们要深度地懂这些,才会有着更多无离开阿的江出场时间不减反增,成为CBA联赛唯一不拼爹的球员当新疆队阿的江指导黯然下课之后,作为新疆队唯一在主教练光环下生长的阿尔斯兰,也成为球迷们心目中离队呼声最高的球员之一。毕竟阿尔斯兰来到新疆队的确有点阿的江指导的面子成分,在八一队解日本神户市神户市(日语神戸市Kbeshi)是位于日本兵库县东南部的都市,为兵库县首府,也是政令指定都市之一,下辖有9个区。全市面积557。02平方公里,人口则有1,522,273人(至202