go - 响应中不存在计算的选定字段
问题描述
我有这个模型,gorm
其中包含 2 个字段,因为它们是从 sql 查询中计算出来的,因此我不想在表中使用它们:
type User struct {
ID uint `json:"id" gorm:"primarykey,autoIncrement"`
MutedUsers []*User `json:"-" gorm:"many2many:user_muted_users;constraint:OnUpdate:CASCADE,OnDelete:CASCADE;"`
BlockedUsers []*User `json:"-" gorm:"many2many:user_blocked_users;constraint:OnUpdate:CASCADE,OnDelete:CASCADE;"`
...
IsMuted bool `json:"is_muted" gorm:"-"`
IsBlocked bool `json:"is_blocked" gorm:"-"`
}
计算上述字段的查询:
var users []models.User
userMutedQ := database.Instance.
Table("user_muted_users").
Select("1").
Where("user_id = ? and muted_user_id = u.id", 1)
userBlockedQ := database.Instance.
Table("user_blocked_users").
Select("1").
Where("user_id = ? and blocked_user_id = u.id", 1)
database.Instance.
Table("users u").
Select("u.*, "+
"(case when exists(?) then 'true' else 'false' end) as is_muted, "+
"(case when exists(?) then 'true' else 'false' end) as is_blocked, ",
userMutedQ, userBlockedQ,
).
Where("u.id = 1").
Scan(&users)
来自控制台的 sql 在针对数据库运行时将生成具有正确值的列is_muted
is_blocked
(some true
some false
)。
然而,该users
列表的所有值都为is_muted
is_blocked
false。gorm
由于-
标志定义,可能会忽略它们。如果我不使用-
thengorm
将is_muted
is_blocked
在我的数据库中创建完全冗余的列,因为总是计算值。
这里的正确方法是什么?
解决方案
根据文档(Declaring Models/Field-Level Permission)和新功能(添加字段标签以忽略迁移和PR),您可以使用migration
指令标签忽略迁移期间的-
字段创建并使用只读字段权限:->
IsBlocked bool `gorm:"->;-:migration"`
推荐阅读
- javascript - 我得到了正确的结果,但在控制台选项卡的调试器中,我总是看到两倍的预期结果
- image - 如何在 Swift 中将 3 张图像(100x100 像素)合并为一张新的大图(300x100 像素)
- sql - 如何在 MS SQL 中将十六进制编码的字符串转换为整数?
- apache-spark - Spark 无法识别来自 String 的换行符、& 等
- python - 'int' 对象没有属性 'append' 没有真正的原因
- javascript - ASP.net 找不到 javascript 函数
- azure - 使用带有 Flask 的 Azure Functions,我如何实现 2 个 Azure 函数 webhook 以同时从控制台运行
- node.js - 无法 Docker 将基于 nuxt 的快速服务器端口转发到主机
- java - 为什么我的计时器没有每秒打印一次?
- spring-boot - 使用 Sprint Boot 和 GraphQL 进行集成测试时出现 Jackson 错误