Database 如何从Go中的多个表构造对象

Database 如何从Go中的多个表构造对象,database,go,Database,Go,我试图找到处理由多个数据库表表示的对象的最佳方法 对于数据库访问,我使用自己的类型包装了sqlx,然后定义了一些方法: type DB struct { *sqlx.DB } func (db *DB) GetSomething(id uint32) *Something {} func (db *DB) AddSomething(*Something) {} 对于使用单个数据库表进行一对一映射的对象来说,它工作得很好。我看到了几种处理多表对象的方法: 在*DB上定义从多个表中进行选

我试图找到处理由多个数据库表表示的对象的最佳方法

对于数据库访问,我使用自己的类型包装了sqlx,然后定义了一些方法:

type DB struct {
    *sqlx.DB
}
func (db *DB) GetSomething(id uint32) *Something {} 
func (db *DB) AddSomething(*Something) {}
对于使用单个数据库表进行一对一映射的对象来说,它工作得很好。我看到了几种处理多表对象的方法:

在*DB上定义从多个表中进行选择的方法,然后 构造一个对象。储蓄也是如此。 在*DB上创建一个层,它将构造一个对象。 不要构造对象,请使用其部分。
我更喜欢数字2,但需要关于如何在Go中设计它的帮助。

如果只是为了减少每次需要用户时代码的重复,请将其放在与用户相关的地方。UserService(如果愿意),以及createUser和IsUserName。有些人甚至会更进一步,只为数据检索和持久性DAO层创建单独的层,对我来说,这太繁琐了


有时你会发现你可能根本不需要一个单独的方法。您正在从数据库中提取一个复杂的报告,但唯一需要它的时间是通过单个rest端点返回。您唯一需要用户名和密码散列的时间是在登录期间-只需在取消登录用户名和密码方法中使用它。在这种情况下,只需在您的业务方法中直接调用sqlx即可。

您看过现有的ORM吗?我更喜欢编写自己的sql。您能详细介绍一下2是什么样子吗?@Not_a_Golfer问您是否看过现有的ORM,而不是建议您使用一个。我认为如果它不能真正回答你的问题,它将帮助你提出更有成效的问题。特别是,张贴前请先校对@一个高尔夫球手问你是否看过现有的ORM,而不是建议你使用一个。我认为如果它不能真正回答你的问题,它将帮助你提出更有成效的问题。特别是,张贴前请先校对!假设我有User{name string,addresses[]Address},以及两个UserService方法Get和Save。用户服务如何获取/保存地址?如果我需要没有地址的用户怎么办?如果地址{[]电话}怎么办?如果只有用户可以拥有地址和电话,我会首先将其全部放在用户服务下,以保持简单。如果地址处理的逻辑随着时间的推移变得过于复杂,我会将其移到用户服务之外,以保持其严密性。