首先说明的是,在项目中使用orm的好处很多:
坏处也是显而易见的:
留意不合法的时间值
MySQL的DATE/DATATIME类型可以对应Golang的time.Time。但是,如果DATE/DATATIME不慎插入了一个无效值,例如2016-00-00 00:00:00, 那么这条记录是无法查询出来的。会返回gorm.RecordNotFound类型错误。零值0000-00-00 00:00:00是有效值,不影响正常查询。
留意tagsql:"default:null"
gorm对各种tag的支持非常完善。但是有些行为跟直觉不太一致,需要注意。当对某字段设置tagsql:"default:null"时,你想通过update设置该字段为null就不可能了,只能通过raw sql。这是gorm设计的取向问题。
如何通过gorm设置字段为null值
字段允许为null值肯定是设计存在问题。但是,往往前人埋下的坑需要你去填。gorm作者给出了两种方法,以string为例:
在golang中,声明该字段为*string
使用sql.NullString类型
推荐使用后者。
留意连接串中的loc
例如通过如下连接串打开mysql连接:
db, err := gorm.Open("mysql", "db:dbadmin@tcp(127.0.0.1:3306)/foo?charset=utf8&parseTime=true&loc=Local")
parseTime=true&loc=Local说明会解析时间,时区是机器的local时区。机器之间的时区可能不一致会设置有问题,这导致从相同库的不同实例查询出来的结果可能解析以后就不一样。因此推荐将loc统一设置为一个时区,如parseTime=true&loc=America%2FChicago
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
linux Debian Buster go版本go1.11.6 linux/amd64 gcc版本8.3.0(Debian 8.3.0-6) libmylib.go mylib.h 主.cpp CGO _ ENABLED = 1 go build-o libmylib . so-build mode = c-shared libmylib . go g -L/路径/到/库/ -利米利布 main
程序员友好的 GoLang ORM, 具有高易用性。 支持 CURD, 链式查询, 内嵌struct, 各种回调 callback 支持 支持Rails类似的 Update, Updates, FirstOrInit, FirstOrCreate 等功能 并且有自动的 CreatedAt, UpdatedAt, 软删除等等功能
在 Go 代码中通过 //export Go函数名称 导出Go的函数名称 在 C 代码中通过 extern 返回值类型 Go函数名称(形参列表); 声明 Go 中导出的函数名称 注意://export Go 函数名称 和 extern 返回值类型 Go函数名称(形参列表); 不能在同一个文件中 package main import "C" import "fmt" // 导出Go函数声
在 Go 语言开篇中我们已经知道,Go 语言与 C 语言之间有着千丝万缕的关系,甚至被称之为 21 世纪的C语言。 所以在 Go 与 C 语言互操作方面,Go 更是提供了强大的支持。尤其是在 Go 中使用 C,你甚至可以直接在 Go 源文件中编写 C 代码,这是其他语言所无法望其项背的。 格式: 在 import "C" 之前通过单行注释或者通过多行注释编写C语言代码 在 import "C" 之
本文向大家介绍go语言中range用法,包括了go语言中range用法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了go语言中range用法。分享给大家供大家参考。具体分析如下: range是go语言系统定义的一个函数。 函数的含义是在一个数组中遍历每一个值,返回该值的下标值和此处的实际值。 假如说a[0]=10,则遍历到a[0]的时候返回值为0,10两个值。 下面是一个例子:这个例子是
本文向大家介绍go语言中linkname的用法,包括了go语言中linkname的用法的使用技巧和注意事项,需要的朋友参考一下 在go语言的源码中,会发现很多,代码只有函数签名,却看不到函数体,如: 此处我们只看到函数签名,却看不到函数体,全局搜了一把,发现它的函数体却定义在src/runtime/proc.go中 它是通过go:linkname把函数签名和函数体连接在一起的。那么我们在代码中,可