gorm简介[中]

上篇讲到如何用gorm增删改查,但如果涉及一些复杂的操作又想避免使用字符串就需要借助Scopes模块

scopes简介

scopes是需要一个自定义的函数func(db *gorm.DB) *gorm.DB作为参数,这样就可以在不破坏链式语法的情况下自定义操作了

比如我要查询GreekAlphabet表中LatinName是”Alpha”或 “Omega”的条目可以这样

chars := []GreekAlphabet{}
db.Model(&GreekAlphabet{}).Where("latin_name in (?)", []string{"Alpha", "Omega"}).Find(&chars)

因为查询多个字段的值只能用 Where(“field in (?)”, fields) 这种方法,相当于是自己拼接sql语句了,这种方法非常容易出错,所以我们用Scopes封装这部分操作

firstAndLast := func(db *gorm.DB) *gorm.DB {
  return db.Where("latin_name in (?)", []string{"Alpha", "Omega"})
}
chars := []GreekAlphabet{}
db.Model(&GreekAlphabet{}).Scopes(firstAndLast).Find(&chars).Error

这样只要我们对firstAndLast做充足的单元测试就可以让其他人非常安心的使用了,但这样做还是很不灵活,所以下面我们使用offset来制造一个灵活的socpes查询

谈谈go的relfect

go的reflect实现了一个运行时反射,它允许程序操纵任意类型的对象

reflect.TypeOf函数能把对象的类型信息,它返回一个relect.Type

reflect.Type.Field模块可以获得struct或者interface中的字段名,字段类型,字段的tag等信息

reflect.ValueOf可以获得一个对象的值信息,比如它是指针还是实体,值的类型和interface类型下的值,它返回一个reflect.Value

我这里简单谈谈reflect的用法和哪些能做到哪些不能做到

Ps:以下所有代码都包含在这个测试项目

gorm简介[前]

我们都知道,在正式环境中直接使用sql来查询数据库是很危险的,处理不好就有被注入式攻击的风险

而且组装sql语句也容易出错和减低代码的可维护性

所以需要一个工具来管理数据库语句的组装和操作

gorm是目前比较成熟的go语言数据库管理库,它可以很方便的把go的结构体和数据库表绑定,从而简化获取数据的操作

git错误push与回滚

之前看漏眼把一个zip的文件commit了,然后我又不小心push到远程gitlab上,导致项目直接大了10M。于是我查了下git的资料,发现可以用删除分支来解决这个问题,下面我来讲讲做法

我的翻墙技术栈

谈到翻墙,很多人第一时间想到的就是shdowsocks,虽然简单的搭建一个shadowsocks服务就可以实现翻墙,不过很快你就会发现代理的速度并不理想,而且有时会发生长时间无法链接的情况。

这是因为网络有的错误丢包被当成拥塞丢包,所以发送窗口一直没法增大。

linux kernel 4.9支持BBR拥塞控制算法可以解决这个问题

也可以通过其他协议工具比如:kcptun

kcptun可以提供双边加速和窗口控制,效果可能比bbr好


归档 下一页