📌  相关文章
📜  gorm 设置列名 - Go 编程语言 - Go 编程语言(1)

📅  最后修改于: 2023-12-03 14:41:37.077000             🧑  作者: Mango

Gorm 设置列名

在使用 Gorm 进行表结构映射时,Gorm 会默认将表的列名与结构体中的字段名一一对应。但是,在实际应用中经常需要对某些列名进行更改,本文将介绍如何通过 Gorm 设置列名。

使用 Column 标签

Gorm 提供了 Column 标签,可以在结构体中设置列名。例如,我们有一个 User 结构体:

type User struct {
    ID         uint   `gorm:"primaryKey"`
    Name       string
    Age        uint8
    Email      string
    CreatedAt  time.Time
    UpdatedAt  time.Time
}

这个结构体在 Gorm 中映射的表的列名将分别为 idnameageemailcreated_atupdated_at。如果需要将 Name 的列名改为 user_name,只需要修改结构体如下:

type User struct {
    ID         uint   `gorm:"primaryKey"`
    UserName   string `gorm:"column:user_name"` // 设置列名为 user_name
    Age        uint8
    Email      string
    CreatedAt  time.Time
    UpdatedAt  time.Time
}

这样,在 Gorm 中映射的表的列名中,Name 的列名就变成了 user_name

使用 ColumnName 方法

除了在结构体中使用 Column 标签外,我们还可以在 Gorm 的定义表结构的过程中使用 ColumnName 方法来设置列名。例如,我们有一个 User 模型:

type User struct {
    gorm.Model
    Name  string
    Email string
}

我们可以通过下面这行代码来将 Name 的列名更改为 user_name

db.Model(&User{}).Column("user_name").UpdateColumn("Name", "小明")

这样,当我们查询 User 表时,对应的字段 Name 就会被映射到表的 user_name 列上。

使用 Table 标签

如果我们想将一个结构体映射到数据库中已有的表,却无法通过修改结构体中字段的方式来更改列名,这时可以使用 Gorm 提供的 Table 标签来达到目的。例如,我们有一个名为 goods_info 的商品信息表:

CREATE TABLE `goods_info` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '商品编号',
  `goods_name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '商品名称',
  `goods_price` decimal(10,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '商品价格',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商品信息表';

我们可以定义一个结构体与之映射:

type Goods struct {
    ID         uint       `gorm:"primaryKey"`
    GoodsName  string     `gorm:"column:goods_name"`   // 设置列名为 goods_name
    GoodsPrice float64    `gorm:"column:goods_price"`  // 设置列名为 goods_price
    CreatedAt  time.Time  `gorm:"column:created_at"`   // 设置列名为 created_at
    UpdatedAt  time.Time  `gorm:"column:updated_at"`   // 设置列名为 updated_at
}

func (Goods) TableName() string {
    return "goods_info"   // 定义模型与表之间的映射关系
}

通过 TableName 方法,我们将 Goods 结构体与数据库中的 goods_info 表进行了映射。在结构体中使用了 Column 标签,则可以将结构体中的字段与表中的列一一对应起来。

结论

通过使用 Column 标签、Table 标签、ColumnName 方法等技巧,我们可以以不同的方式设置 Gorm 映射结构体与数据库表结构之间的关系,达到更好的应用程序设计效果。