Golang中Gorm忽略字段的解决方法

Golang中Gorm忽略字段的解决方法 正在构建一个RESTful API,但无法在GORM中忽略列…当我使用 sql:"-"gorm:"-" 时都不起作用。有人能提供提示吗?

1 回复

更多关于Golang中Gorm忽略字段的解决方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在GORM中忽略字段有几种可靠的方法。以下是具体的解决方案和示例代码:

方法1:使用 gorm:"-" 标签(推荐)

确保标签正确放置在结构体字段上:

type User struct {
    ID        uint   `gorm:"primaryKey"`
    Name      string
    Email     string
    Password  string `gorm:"-"`  // 这个字段会被GORM忽略
    CreatedAt time.Time
    UpdatedAt time.Time
}

方法2:使用 sql:"-" 标签

type Product struct {
    ID          uint   `gorm:"primaryKey"`
    Name        string
    Price       float64
    InternalID  string `sql:"-"`  // 这个字段会被忽略
}

方法3:使用匿名字段

type BaseModel struct {
    ID        uint      `gorm:"primaryKey"`
    CreatedAt time.Time
    UpdatedAt time.Time
}

type Order struct {
    BaseModel
    OrderNumber string
    TotalAmount float64
    TempData    map[string]interface{} `gorm:"-"` // 临时数据,不存储到数据库
}

方法4:检查常见问题

确保没有其他标签冲突:

type Post struct {
    ID      uint   `gorm:"primaryKey"`
    Title   string
    Content string
    // 错误的用法:多个标签冲突
    // Author  string `gorm:"column:author" gorm:"-"` // 这会出错
    
    // 正确的用法
    Author  string `gorm:"-"` // 只使用忽略标签
}

完整示例

package main

import (
    "gorm.io/gorm"
    "gorm.io/driver/sqlite"
)

type User struct {
    gorm.Model
    Username string `gorm:"uniqueIndex"`
    Email    string
    Password string `gorm:"-"` // 这个字段在数据库操作时会被忽略
    Token    string `sql:"-"`  // 这个字段也会被忽略
}

func main() {
    db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
    if err != nil {
        panic("failed to connect database")
    }

    // 自动迁移
    db.AutoMigrate(&User{})
    
    // 创建用户时,Password和Token字段不会被保存到数据库
    user := User{
        Username: "john_doe",
        Email:    "john@example.com",
        Password: "secret123", // 这个不会存入数据库
        Token:    "abc123",    // 这个也不会存入数据库
    }
    
    db.Create(&user)
    
    // 查询时,Password和Token字段会是零值
    var result User
    db.First(&result, user.ID)
    // result.Password 和 result.Token 会是空字符串
}

如果这些方法仍然不工作,检查GORM版本和导入的包是否正确。确保使用的是最新版本的GORM,并且没有其他配置覆盖了标签行为。

回到顶部