【问题标题】:creating top level package on gorm orm for micro services in golang在 gorm orm 上为 golang 中的微服务创建顶级包
【发布时间】:2020-04-13 10:22:26
【问题描述】:

我们是一家初创科技公司。我们使用 Golang 作为我们微服务的主要语言,并使用gorm orm 作为我们连接到我们的PostgreSQL 数据库的接口。

目前,我们有多个微服务,有多个开发人员在开发它们。然而问题在于,由于在gorm 中有很多方法可以做一件事,所以每个人都按照自己的方式在数据库上编写查询。所以有些人使用.Table() 函数进行查询,而另一些人只是通过.Model() 来计算表本身。

所以现在代码不是标准的,我们希望有一种标准的方式来对我们的数据库进行查询。我们认为,如果我们可以有一个像库这样的包,它提供orm 的接口供我们使用(这样如果我们想更改orm 或不使用任何我们不必更改所有代码)以标准方式解决问题。

但是我们从来没有创造过这样的东西,我们基本上不知道如何解决这个问题,以及是否存在任何图书馆做过这样的事情?我们也在努力使用标准的方式在 Golang 中进行查询,所以如果你能分享你对如何开发这样一个甚至有可能被公开的系统的想法,我们将不胜感激。

【问题讨论】:

    标签: database go go-gorm


    【解决方案1】:

    我们完全遇到了同样的问题,我们将 gorm 用于不同的应用程序和不同的数据库(PostgreSQL、MySQL 和 SQLite)。

    我们天真地决定使用我们所谓的Storage 接口来抽象gorm,这个接口或多或少具有您对任何orm 所需的基本操作。它看起来像这样:

    type Storage interface {
        Create(object interface{}) error
        Retrieve(object interface{}, queries ...Query) error
        Update(object interface{}) error
        Delete(object interface{}) error
    }
    

    在开发之初,它为我们提供了很好的服务,我们甚至可以使用普通文件来实现这个接口,它就可以工作。

    但是

    几个月后,我们开始注意到它的局限性。有些操作可以在gorm 中完成,而我们无法使用我们的界面进行操作。因此,很明显,我们决定扩展接口以提供更多功能。同样,这让我们又花了几个月的时间,直到我们意识到:拥有gorm 的所有功能的唯一方法是为gorm 提供的所有内容提供一个接口,这并不是我们开始编写这个包的原因。

    由于这个接口无处不在,我们决定作为临时解决方案扩展接口并添加一个返回gorm.DB对象的函数,以便我们可以再次直接使用它。

    从道理上讲,我强烈建议不要构建这样的界面。花时间帮助开发gormv2,根据这个post应该很快就会出来。

    【讨论】:

      【解决方案2】:

      我认为包装像gorm这样复杂的东西是一项复杂的任务,如果你不清楚如何处理它,你最好避免这样做。

      一般来说,我建议先弄清楚你想强制执行什么,然后才决定你想如何做到这一点,并牢记明确的要求。在您知道自己到底想做什么之前就使用工具是一种使事情变得更糟而不是更好的可靠方法。您可以按照以下步骤操作:

      1. 首先记录您的代码标准,并在代码审查中向人们指出它们,以防它们不遵守;

      2. 自动检查您可以正式检查到持续集成管道中的任何内容(GitHub Actions、GitLabCI、TravisCI、CircleCI 等);

      3. 当且仅当上述方法不起作用时,请考虑创建自己的包装器,以强制开发人员使用特定的样式。

        到最后一步,您应该已经对缺失的内容有一个相当不错的了解,然后弄清楚如何修复它会容易得多。

      【讨论】:

        猜你喜欢
        • 2015-06-08
        • 2017-06-07
        • 1970-01-01
        • 2021-09-04
        • 2018-07-04
        • 2018-10-24
        • 2019-04-09
        • 1970-01-01
        • 2019-12-04
        相关资源
        最近更新 更多