1 回答

TA貢獻1836條經驗 獲得超3個贊
您選擇的抽象級別不支持與數據庫無關的實現。您期待 SQL 查詢,并且您正在返回*sql.Rows.
如果您想獨立于數據庫(包括關系數據庫和 NoSQL 數據庫),則需要使用更高的抽象級別,其中不存在 SQL 或 NoSQL 查詢等術語。
例如,如果您打算查詢、加載和保存用戶,您界面的相關部分可能如下所示:
type User struct {
ID string
// other info about users
}
type Source interface {
GetUser(id string) (*User, error)
SaveUser(u *User) error
FindUsersByFirstName(firstName string) ([]*User, error)
}
此接口不限制實現使用 SQL 查詢和相關對象,但它表達了您需要的操作。您應用程序的其他部分應該(必須)僅通過此接口訪問數據層。所有的細節(例如 SQL 查詢)都屬于實現。
此外,在您繼續進行這種抽象之前,請檢查其優勢和所需的額外工作,因為人們通常會為極不可能的場景做計劃。如果您從 SQL 數據庫開始,您可能永遠不會切換到 NoSQL 數據庫。
你不能(不應該)有一個單一的數據源層來支持你想要的抽象級別的所有數據庫。這將需要“開發”一種獨立于數據庫的查詢語言及其解析器,然后您需要將其轉換為特定的數據庫查詢。如果要支持所有數據庫,最簡單的方法是合并存儲庫和數據源層?;蛘叻艞壷С炙袛祿?,因為幾乎 99% 的項目永遠不會切換到根本不同的數據庫。
- 1 回答
- 0 關注
- 291 瀏覽
添加回答
舉報