簡體   English   中英

為 golang 中的微服務在 gorm orm 上創建頂級 package

[英]creating top level package on gorm orm for micro services in golang

我們是一家初創科技公司。 我們使用 Golang 作為我們微服務的主要語言,並gorm orm 作為我們連接到PostgreSQL數據庫的接口。

目前我們有多個微服務,有多個開發人員在開發它們。 然而問題是,由於在gorm中有很多方法可以做一件事,每個人都用自己的方式在數據庫上編寫查詢。 所以有些人使用.Table() function 進行查詢,而另一些人只是通過.Model()來計算表本身。

所以現在代碼不是標准的,我們希望有一種標准的方式來對我們的數據庫進行查詢。 我們認為,如果我們可以擁有一個 package 之類的庫,該庫提供orm的接口供我們使用(這樣,如果我們想更改orm的接口,我們就沒有使用任何代碼)以標准方式,它解決了問題。

但是我們從來沒有創造過這樣的東西,我們基本上不知道如何解決這個問題,以及是否存在任何圖書館做過這樣的事情? 此外,我們正在努力以標准方式在 Golang 中進行查詢,因此,如果您能分享您對如何開發這樣一個甚至有可能公開發布的系統的想法,我們將不勝感激。

我認為包裝像 gorm 這樣復雜的東西是一項復雜的任務,如果你不清楚如何處理它,你最好避免這樣做。

一般來說,我建議首先弄清楚你想要執行什么,然后才決定你想如何做到這一點,並牢記明確的要求。 在您知道自己到底想做什么之前就使用工具是一種使事情變得更糟而不是更好的可靠方法。 以下是您可以遵循的步驟:

  1. 從記錄您的代碼標准開始,並在代碼審查中將人們指向他們,以防他們不遵守;

  2. 自動檢查您可以正式檢查到持續集成管道中的任何內容(GitHub Actions、GitLabCI、TravisCI、CircleCI 等);

  3. 當且僅當上述事情不起作用時,請考慮創建自己的包裝器,該包裝器將為開發人員強制使用特定的樣式。

    到最后一步,您應該已經對缺失的內容有一個相當不錯的了解,然后弄清楚如何修復它會容易得多。

我們遇到了完全相同的問題,我們將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提供接口,這並不是我們開始編寫此 package 的原因

由於這個接口到處都在使用,我們決定作為臨時解決方案擴展接口並添加一個返回gorm.DB object 的 function 以便我們可以再次直接使用它。

故事的道德,我強烈建議不要建立這樣的界面。 花時間幫助開發gormv2 ,根據這篇文章,它應該很快就會出來。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM