连接表的名称需要是UserLanguages.但戈姆总是将表创建为user_languages.

type User struct {
  gorm.Model
  Languages []*Language `gorm:"many2many:UserLanguages;"`
}

type Language struct {
  gorm.Model
  Name string
  Users []*User `gorm:"many2many:UserLanguages;"`
}

如何更改连接表的名称?

我找到了NamingStrategy in GORM's docs个:

GORM允许用户通过覆盖需要实现接口Namer的默认NamingStrategy来更改命名约定

但无论我怎么试,我都不能让它工作.也许有人有这样的例子?

推荐答案

GORM将try 将CamelCase转换为snake_case,因为这是大多数数据库中表的常见命名约定.

骆驼到蛇的大小写转换也将应用于您的 case ,位于many2many表名称注释上.例如:如果您使用AaaBbbCccDdd,您最终将得到一个名为aaa_bbb_ccc_ddd的连接表

要更改默认行为,您可以在GORM配置的命名策略中将NoLowerCase值覆盖为true.

package main

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

type User struct {
    gorm.Model
    Languages []*Language `gorm:"many2many:UserLanguages;"`
}
type Language struct {
    gorm.Model
    Name  string
    Users []*User `gorm:"many2many:UserLanguages;"`
}

func main() {
    db, err := gorm.Open(sqlite.Open("mydb.db"), &gorm.Config{
        NamingStrategy: schema.NamingStrategy{
            NoLowerCase: true, // << HERE
        },
    })
    if err != nil {
        panic("failed to connect database")
    }
    db.AutoMigrate(&User{})
    db.AutoMigrate(&Language{})
}

如果您确实需要覆盖JoinTableName方法(尽管您可能不需要这样做),您可以执行如下所示的操作,最终得到名为UserLanguages_OVERRIDE_HERE的连接表

type MyCustomNaming struct {
    schema.NamingStrategy
}
func (MyCustomNaming) JoinTableName(table string) string {
    return table + "_OVERRIDE_HERE"
}
func main() {
    ns := MyCustomNaming{
        NamingStrategy: schema.NamingStrategy{
            NoLowerCase: true,
        },
    }
    db, err := gorm.Open(sqlite.Open("mydb.db"), &gorm.Config{
        NamingStrategy: ns,
    })
...

Go相关问答推荐

出口上下文值密钥的安全方法?

golang父进程的副本无法进行https/tls调用并获得tls:未能验证证书""

正确使用pgtype的方法

如何用';贪婪原则';正确地

无法读取postman 中的表单数据

如何将 goose 迁移与 pgx 一起使用?

用 fork 替换 Go 依赖:...用于两个不同的模块路径

甚至用天真的洗牌分配?

Apache Beam 在 Go 中从 PCollection 中 Select 前 N 行

为什么不同的 Wireguard 私钥会产生相同的公钥?

assert: mock: I don't know what to return because the method call was unexpected 在 Go 中编写单元测试时出错

golang pic.ShowImage 为什么它不生成图像而是向我发送base64值

如何根据 Go 中第二次出现的分隔符拆分字符串?

Golang:隐式 struct 匹配

此代码如何生成内存对齐切片?

GoReleaser 和 ssh-agent Github 操作:为什么无法读取用户名...终端提示已禁用?

为什么 x/net/html Token().Attr 上的 len 在此处为空切片返回非零值?

使用 LoadLibraryA(path_to_dll) 加载 DLL 会将文件描述符 0、1 和 2 的继承句柄标志 (HANDLE_FLAG_INHERIT) 从 1 更改为 0

在 Go 中,为什么 exec.Command() 失败但 os.StartProcess() 成功启动winget.exe?

我该如何做错误处理惯用的方式