Golang Go语言中请教 ent ORM 框架,分表如何操作呢?

发布于 1周前 作者 phonegap100 来自 Go语言

Golang Go语言中请教 ent ORM 框架,分表如何操作呢?

现在有个项目要用 Ent 做数据库操作,但是有些表做了分表,Ent 如何处理呢?总不会是每个分表 都创建一个 Schema 吧?如何能做到一个表 Schema 根据一定规则获取不同分表的数据呢?求教求教。

11 回复

请看这个 PR 里我的回答: https://github.com/ent/ent/pull/2020 。需要你动动手加 template ,但是如果熟悉 Ent 应该不难

更多关于Golang Go语言中请教 ent ORM 框架,分表如何操作呢?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


刚用 Ent , template 还没弄明白呢 T_T~

只有增加需要 template ,删改查用 s.From(table)就行

有相关文档吗?哥,小弟听不懂啊~~,我也出现了“query error Error 1146: Table ‘test.apple’ doesn’t exist”,这种问题,和你的 GitHub 里的回答一样,不知道怎么处理好。

client.User.Query().Where(
func(s *sql.Selector) {
table := sql.Table(“user_table_1”)
s.From(table)
},
).All(context.TODO()) 我觉得这个挺明确啊,user_table_1 是你的分表

这里我确实是这么做的,但是结果却报没有字段错误,例如:“ Error 1054: Unknown column ‘user.id’ in ‘field list’ FAIL”!

是不是 Schema 那边我使用了 Mixin 导致的?我创建了 usermixin.go 做公共 Schema ,然后为每个分表创建一个 Schema 在复用 usermixin.go 定义的字段和索引。

老哥能否指点一下 template 是怎么实现的吗?官方文档我看得有点懵了~~

template 要靠你自己去理解了,因为比较复杂我几句话也没法解释到让你明白。首先你要对 go 的代码生成有个概念 https://pkg.go.dev/text/template ,比如变量怎么定义,怎么引用其他的 template 。然后你要学习 Ent 的代码生成方式,比如 create 对应的就是这个: https://github.com/ent/ent/blob/master/entc/gen/template/dialect/sql/create.tmpl

感谢大佬指点,我尝试和好几个办法,都不好使,最后我直接改 meta.tmpl 模板了,将常量 Table 改成变量,查询的时候直接改 Table 的值,不晓得这么做有没有副作用~~

你能用就行。不过要是经常要分表建议你考虑考虑要不迁移到 tidb/polardb 上。或者直接 nosql

是有计划用 polardb ~

在Golang中使用ent ORM框架进行分表操作时,通常需要结合一些自定义逻辑和数据库中间件来实现,因为ent ORM本身并不直接支持分表功能。以下是一个大致的操作思路:

  1. 定义Ent Schema:首先,按照正常方式定义你的ent schema,包括实体、字段和关系等。

  2. 自定义逻辑:由于ent ORM不直接支持分表,你需要在查询和插入数据时手动指定表名。这通常通过编写自定义的存储钩子(hook)或查询方法来实现。

  3. 使用数据库中间件:考虑使用数据库中间件(如MySQL的sharding-jdbc或ProxySQL)来实现分表逻辑。这些中间件可以在数据库层面根据一定的规则(如哈希、范围等)将请求路由到不同的表。

  4. 动态表名:在ent的查询或插入操作中,通过动态设置表名来实现分表。这可能需要修改ent的底层代码或使用一些反射技巧,因为ent的API通常不允许直接设置表名。

  5. 测试与验证:在实现分表逻辑后,务必进行充分的测试,确保数据能够正确地插入、查询和更新。同时,验证分表策略是否符合你的业务需求和性能要求。

  6. 文档与监控:编写详细的文档,记录分表策略和实现细节。同时,设置监控和报警机制,以便在出现问题时能够及时发现和处理。

请注意,由于ent ORM本身不支持分表,上述方法可能需要一定的定制化和开发工作。如果你对数据库中间件或底层存储有深入了解,实现起来可能会更加容易。

回到顶部