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 关注
- 334 浏览
添加回答
举报
