在 gorm orm 上为 golang 中的微服务创建顶级包
creating top level package on gorm orm for micro services in golang
我们是一家初创科技公司。我们使用 Golang 作为我们微服务的主要语言,并使用 gorm
orm 作为我们连接到 PostgreSQL
数据库的接口。
目前我们有多个微服务,有多个开发人员在处理它们。然而问题是,由于在 gorm
中有很多方法可以做一件事情,每个人都用自己的方式在数据库上编写查询。所以一些人使用 .Table()
函数进行查询,而另一些人只是通过 .Model()
来计算 table 本身。
所以现在代码不是标准的,我们希望有一个标准的方法来对我们的数据库进行查询。我们认为,如果我们可以拥有一个像库这样的包,它提供 orm
的接口供我们使用(这样,如果我们想更改 orm
或不使用我们没有使用的任何接口'不必以标准方式更改所有代码),它解决了问题。
但是我们从来没有创造过这样的东西,我们基本上不知道如何解决这个问题,也不知道是否存在任何图书馆做过这样的事情?此外,我们正在努力以标准方式在 Golang 中进行查询,因此如果您可以分享您关于如何开发这样一个甚至有可能被宣布 public 的系统的想法,我们将不胜感激。
我认为包装像 gorm 这样复杂的东西是一项复杂的任务,如果您不清楚如何处理它,最好避免这样做。
一般来说,我建议首先弄清楚您想要强制执行什么,然后再决定您想要如何执行此操作,并牢记明确的要求。在你知道你到底想做什么之前就抓住一个工具是让事情变得更糟而不是更好的可靠方法。以下是您可以遵循的步骤:
首先记录您的代码标准,并在代码审查时向人们指出这些标准,以防他们不遵守;
自动检查您可以正式检查到持续集成管道中的任何内容(GitHub Actions、GitLabCI、TravisCI、CircleCI 等);
当且仅当上述方法不起作用时,考虑创建您自己的包装器,它会强制开发人员使用特定的样式。
到最后一步,您应该已经对究竟缺少什么有了相当不错的了解,然后就可以更容易地找出如何修复它。
我们遇到了完全同样的问题,我们将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
提供的所有内容提供一个接口,这并不是为什么我们开始写这个包.
由于到处都在使用这个接口,我们决定作为临时解决方案扩展接口并添加一个函数,returns gorm.DB
对象所以我们可以直接再次使用它。
故事的寓意,我强烈建议不要构建这样的界面。花时间帮助 gorm
的 v2 which should be coming out soon according to this post 的开发。
我们是一家初创科技公司。我们使用 Golang 作为我们微服务的主要语言,并使用 gorm
orm 作为我们连接到 PostgreSQL
数据库的接口。
目前我们有多个微服务,有多个开发人员在处理它们。然而问题是,由于在 gorm
中有很多方法可以做一件事情,每个人都用自己的方式在数据库上编写查询。所以一些人使用 .Table()
函数进行查询,而另一些人只是通过 .Model()
来计算 table 本身。
所以现在代码不是标准的,我们希望有一个标准的方法来对我们的数据库进行查询。我们认为,如果我们可以拥有一个像库这样的包,它提供 orm
的接口供我们使用(这样,如果我们想更改 orm
或不使用我们没有使用的任何接口'不必以标准方式更改所有代码),它解决了问题。
但是我们从来没有创造过这样的东西,我们基本上不知道如何解决这个问题,也不知道是否存在任何图书馆做过这样的事情?此外,我们正在努力以标准方式在 Golang 中进行查询,因此如果您可以分享您关于如何开发这样一个甚至有可能被宣布 public 的系统的想法,我们将不胜感激。
我认为包装像 gorm 这样复杂的东西是一项复杂的任务,如果您不清楚如何处理它,最好避免这样做。
一般来说,我建议首先弄清楚您想要强制执行什么,然后再决定您想要如何执行此操作,并牢记明确的要求。在你知道你到底想做什么之前就抓住一个工具是让事情变得更糟而不是更好的可靠方法。以下是您可以遵循的步骤:
首先记录您的代码标准,并在代码审查时向人们指出这些标准,以防他们不遵守;
自动检查您可以正式检查到持续集成管道中的任何内容(GitHub Actions、GitLabCI、TravisCI、CircleCI 等);
当且仅当上述方法不起作用时,考虑创建您自己的包装器,它会强制开发人员使用特定的样式。
到最后一步,您应该已经对究竟缺少什么有了相当不错的了解,然后就可以更容易地找出如何修复它。
我们遇到了完全同样的问题,我们将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
提供的所有内容提供一个接口,这并不是为什么我们开始写这个包.
由于到处都在使用这个接口,我们决定作为临时解决方案扩展接口并添加一个函数,returns gorm.DB
对象所以我们可以直接再次使用它。
故事的寓意,我强烈建议不要构建这样的界面。花时间帮助 gorm
的 v2 which should be coming out soon according to this post 的开发。