• gorm 查询总是将表名转为复数的问题

    这几天在用GoLang写个东西,期间用到了gorm框架。 在用gorm查询时遇到了一个奇怪的问题:就是这个框架会自动将model的名称转为复数形式。 先来看下具体的报错信息。这里是一个用户model: 查询语句在这里: 执行查询的时候收到了如下的错误信息: 错误信息显示查询的时候没有查预期中user表,反而是查了一个复数形式的users表。 跟踪了下gorm框架的代码,发现这里是获取表名的关键点: 关键在NamingStrategy的ns.SingularTable属性上。查了下资料后知道可以配置中设置相关的属性: 具体是在创建数据库连接时做这个配置。完整的数据库连接配置在这里: 倒数第4行代码是起点。(这是第一种方式) 后来又在gorm的文档中发现了其他两种方式: 为User model 创建一个TableName()函数,大致如下: 这是第二种方式。 在查询时临时指定表名 这是第三种方式。但是可以看出,这个方案并不好,谁有耐心在每次查询时都指定表名啊。 在gorm框架的schema.go的ParseWithSpecialTableName()方法(第123行)可以看到下面的代码: 在这段代码里可以看到设置表名的几种方式和对应的优先级。这里除我们前面提到的三种设置表名的方式外,还提示了第四种方式:通过嵌入式命名规则。可以猜测下第四种方式的使用场景:比如在需要分表的场景下这种方式还是非常便捷的。不过现在对我来说前面三种方式已经完全够用了,第四种具体如何使用我就懒得探索了… 就这样了!END!!!

    [阅读更多...]
  • GoLang设计模式整合版

    过去的一段时间里整理了下GoLang设计模式相关的一些内容。主要是是翻译的《All Design Patterns in Go》这个系列。因为文中有一些图片,且翻译的质量也有些不是很好,所以暂时放在博客园上,在这里仅是列个目录出来。考虑着做一些修整后再将完善一些的版本放到这里。 其实我本来不太喜欢拿设计模式说事儿的(主要是面试的一些不好经历),也有过轻模式重原则需求为中心的观点。直到去年(2022年)开始使用GoLang做一些生产上的项目,面对一门新的且极具个性的语言,一时不知道该如何着手组织代码,就顺手在搜索引擎上敲出了“Go语言 设计模式”这样的搜索条目。当意识到在做什么的时候不禁开始苦笑——属于是自己打自己脸了。 从这里开始,我觉得有必要修正下对设计模式的看法了:设计模式是一项入门阶段的基本功——毕竟是经过许多年的实践提炼出来的东西,可靠性上还是有些保证的。但是拘泥于设计模式肯定也是不可取的,在入门阶段过去后就得有点儿自己的想法了。这个过程有点儿类似倚天中张无忌学太极剑,也好像令狐冲学独孤九剑,最开始还有类似“破刀式”“破枪式”这样的固定招法,但只到领悟了“无招胜有招”才算是登堂入室。 啊啊,废话太多了。目录在下面,先凑合看一下: 01. GoLang 设计模式 – 建造者模式 02. GoLang 设计模式 – 工厂模式 03. GoLang 设计模式 – 抽象工厂模式 04. GoLang 设计模式 – 单例模式 05. GoLang 设计模式 – 原型模式 06. GoLang 设计模式 – 对象池模式 07. GoLang 设计模式 – 责任链模式 08. GoLang 设计模式 – 命令模式 09. GoLang 设计模式 – 迭代器模式 10. GoLang 设计模式 – 中介者模式 11. GoLang 设计模式 – 备忘录模式 12. GoLang 设计模式 – 空对象模式 13. GoLang 设计模式 – 观察者模式 14. GoLang 设计模式 – 状态模式 15. GoLang 设计模式 – 策略模式 16. GoLang 设计模式 – 模板方法模式 17. GoLang 设计模式 – 访客模式 18. GoLang 设计模式 – 适配器模式 19. GoLang 设计模式 – 桥接模式 20. GoLang 设计模式 – 组合模式 21. GoLang 设计模式 – 装饰模式 22. GoLang 设计模式 – 门面模式 23.

    [阅读更多...]
  • GoLang读取yaml配置文件

    最近这段时间在用GoLang写项目。其中如何读取配置文件一度是让我比较头疼的事情,好在最后都解决了,这里简单记录一下GoLang读取配置文件的方式。 因为写了多年java springboot项目的缘故,在多种配置方式中独独比较偏爱yaml的格式。因此为新项目选择配置文件的时候就毫不犹豫地选择了继续使用yaml。 使用yaml时遇到了这样几个问题: yaml配置文件读取并映射为struct yaml多配置文件读取 适应性选择配置 接下来就以这几个问题的顺序来简单介绍下使用GoLang如何读取yaml配置文件以及关于配置文件选择的问题。 读取yaml配置文件 也许很多人都在网上搜索过“golang读取yaml”这样的词条,搜索结果也通常大部分都是推荐使用gopkg.in/yaml这个package。 gopkg.in/yaml诚然是读取yaml最经典的一个方案,但却不是最简单易用的一个方案。 读取yaml(或其它类型的配置文件)我首先推荐使用viper,因为它用起来最简洁。 来看一个viper读取配置文件的示例: 到这里配置文件的读取就已经完成了。 使用配置信息时可以使用viper的GetInt、GetString、GetBool等方法来读取。 比如类似下面的配置信息: 要获取配置中的age信息时可以这样做: viper也支持将配置信息渲染为struct对象: 需要注意一点:viper并不是直接将yaml配置文本转换成了struct对象。viper是先将配置信息转换成了map结构,而后再通过github.com/mitchellh/mapstructure这个模块将map对象转换为struct对象。因此在配置struct成员映射关系时使用的是mapstructure关键字,而非yaml关键字。 yaml多配置文件读取 在java springboot中可以做这样的配置:在application.yml做通用的配置;在application-dev.yml和application-prod.yml添加适应不同环境的个性化配置;如有相同配置项,后者可以覆盖前者。 我非常喜欢这种配置方法,能够灵活适配不同环境,减少冗余配置。但很不幸,viper目前并不支持类似的操作。头疼了一段时间后,干脆参考viper的代码写了一个新的项目vibe。这个项目目前的版本是0.0.5。在读取yaml文件这一点上,vibe的使用方式和viper几乎是一样的——除了能够满足读取多配置文件这一项。 看下示例代码: 这里只看第一行代码就好。这行代码里读取了两个配置文件:config.yml和config-dev.yml,两个文件中的配置有重合之处(不详细贴配置信息了,可参考后文示例代码),但是最终输出信息以后者中的配置为准。 适应性选择配置 虽然这个写在最后,不过应该是最好解决的事情了,通过环境变量、命令参数都能解决。为此写段演示代码意义好像也不大,就这样吧。 文中示例代码见git:yaml-reader End!!

    [阅读更多...]
  • Golang Json 处理

    这次记录下golang json处理的几个场景: 不输出空值 输出时使用别名 不输出指定字段 不输出空值 不希望输出空值,可以在注解中使用omitempty,示例代码如: 输出时使用别名 依然使用注解,示例: 不输出指定字段 不输出指定字段有两种方式: 变量首字母小写,匿名变量 使用注解,如下: 就是这些了。 示例代码 Json Ignore 。 End!

    [阅读更多...]