Gorm查询设置主表别名未生效 如何实现别名避免写全表名
解决方案
可以通过以下两种稳定的方式实现Gorm主表别名设置:
- 修正Table方法的写法,明确指定AS关键字和转义符
你的写法别名不生效,是因为Gorm的自动表名转义逻辑识别到带空格的表名字符串时,会优先保留带schema的全表名,吞掉后面的别名部分。只要调整Table参数的写法,显式加AS和转义即可:
db. Table(fmt.Sprintf("`%s` AS t", model.BlogTag{}.TableName())). Select(` t.id, t.path, t.title, t.hits, COUNT(DISTINCT b.id) AS used_times `). Joins("LEFT JOIN contentitem_tag_map bt ON bt.tag_id = t.id"). Joins("LEFT JOIN content b ON b.id = bt.content_item_id AND b.state = 1"). Where("t.published = 1"). Group("t.id"). Order("used_times DESC"). Find(&tags).Error
调整后主表生成的SQL会变为 FROM myschema.vk9wz_tags AS t,别名t可正常识别。
- Gorm v2版本推荐使用TableExpr方法,兼容性更好
如果用的是Gorm v2,优先用专门处理自定义表表达式的TableExpr方法,避免转义冲突:
db.Model(&model.BlogTag{}). TableExpr("? AS t", model.BlogTag{}.TableName()). Select(` t.id, t.path, t.title, t.hits, COUNT(DISTINCT b.id) AS used_times `). Joins("LEFT JOIN contentitem_tag_map bt ON bt.tag_id = t.id"). Joins("LEFT JOIN content b ON b.id = bt.content_item_id AND b.state = 1"). Where("t.published = 1"). Group("t.id"). Order("used_times DESC"). Find(&tags).Error
注意事项
如果配置了自定义NamingStrategy表名规则、多schema自动前缀,不要直接写不带转义的表名字符串,会导致别名识别异常,优先用带参数绑定的TableExpr写法。
内容的提问来源于stack exchange,提问作者Fabio B.
相关产品推荐
相关产品推荐

