英文:
How to exclude a column from being Selected
问题
我正在使用Go作为编程语言,使用gorm作为ORM。
这是结构体模型:
type Product struct {
ID int `gorm:"primaryKey" json:"id"`
Name string `gorm:"notNull;size:125" json:"name"`
Inventory int `gorm:"-:migration" json:"inventory"`
}
当我执行如下的Join操作时:
DB.Joins("Product")
在select语句中,会出现inventory字段,导致类似以下错误:
Unknown column 'Product.inventory' in 'field list'
当然,由于标签"-:migration"的存在,它在products
表中并不存在。
我想知道应该使用什么标签来使Inventory在select语句中被忽略/排除?
我只想在select语句中排除inventory字段,但在解析为JSON时,仍希望该字段存在。
英文:
I am using Go as language code and gorm as ORM
This is the struct model:
type Product struct {
ID int `gorm:"primaryKey" json:"id"`
Name string `gorm:"notNull;size:125" json:"name"`
Inventory int `gorm:"-:migration" json:"inventory"`
}
when I perform Join like this:
DB.Joins("Product")
the inventory field is present in select statement cause an error something like:
> Unknown column 'Product.inventory' in 'field list'
of course it doesn't exist in products
table because of this tag "-:migration"
what tag should I use to make Inventory being ignored/exclude in select statement???
I only want to exclude inventory from select statement, I want the field still there when parsed to json
答案1
得分: 1
你应该使用的标签是gorm:"-:all"
,除了迁移权限之外,还包括读写权限。你可以在官方文档中了解更多信息:https://gorm.io/docs/models.html#Fields-Tags。我将与你分享我编写的用于测试的代码:
package main
import (
"fmt"
"gorm.io/driver/postgres"
"gorm.io/gorm"
)
type Product struct {
ID int `gorm:"primaryKey" json:"id"`
Name string `gorm:"notNull;size:125" json:"name"`
Inventory int `gorm:"-:all" json:"inventory"`
}
func main() {
dsn := "host=localhost user=postgres password=postgres dbname=postgres port=5432 sslmode=disable"
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
if err != nil {
panic(err)
}
db.AutoMigrate(&Product{})
db.Create(&Product{Name: "pen"})
db.Create(&Product{Name: "box"})
var product Product
db.Find(&product, 1)
// 在这里你仍然可以访问和设置JSON。
// 显然,该值无法从数据库中检索,因为它在数据库中不存在
product.Inventory = 22
data, _ := json.Marshal(product)
fmt.Println(string(data))
}
如果有帮助,请告诉我,谢谢!
英文:
The tag that you should use is gorm:"-:all"
that also involves read/write permission other than the migration one.
You can read more about this in the official doc: https://gorm.io/docs/models.html#Fields-Tags
I'll share with you the code I wrote to test this out:
package main
import (
"fmt"
"gorm.io/driver/postgres"
"gorm.io/gorm"
)
type Product struct {
ID int `gorm:"primaryKey" json:"id"`
Name string `gorm:"notNull;size:125" json:"name"`
Inventory int `gorm:"-:all" json:"inventory"`
}
func main() {
dsn := "host=localhost user=postgres password=postgres dbname=postgres port=5432 sslmode=disable"
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
if err != nil {
panic(err)
}
db.AutoMigrate(&Product{})
db.Create(&Product{Name: "pen"})
db.Create(&Product{Name: "box"})
var product Product
db.Find(&product, 1)
// here you can still access and set the JSON.
// Obviously, the value cannot be retrieved from the DB as it doesn't exist there
product.Inventory = 22
data, _ := json.Marshal(product)
fmt.Println(string(data))
}
Let me know if this helps, thanks!
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论