为什么 Gorm 在 CreateTable 时忽略结构?

Why Gorm ignore a struct when CreateTable?

我使用的是哪个版本的 Go (go version)?

Go 版本 Go 1.9.1 Linux/amd64

我使用的是哪个数据库及其版本?

sqlite3

重现我的问题的完整可运行程序:

需要 GORM's docker compose config 可运行或请提供您的配置。

package main

import (
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/sqlite"
)

type A struct {
    ID      int
    Bs              [] *B `gorm:"foreignkey:AID"`
}

type B struct {
    ID      int
    AID     int
    Config          Config `gorm:"type:text"`
}

type Config struct {
    attr1   int
    attr2   string
}


func main() {
    Db, err := gorm.Open("sqlite3", "test.db")
    if err != nil {
        panic(err)
    }
    Db.CreateTable(&A{})
    Db.CreateTable(&B{})
}

但是test.db的schema是

sqlite> .schema
CREATE TABLE "as" ("id" integer primary key autoincrement );
CREATE TABLE "bs" ("id" integer primary key autoincrement,"a_id" integer );

正如我们所见,B 的 config 属性没有创建。 那么为什么 Gorm 会忽略 Config 结构?

您的数据未规范化。 Config 是一个包含多个字段的结构。您可以使用外键将配置提取到单独的 table 中,就像您对 B:

所做的那样
type B struct {
    ID     int
    AID    int
    Config Config `gorm:"foreignkey:BID"`
}

然后在Config中定义外键:

type Config struct {
    BID   int
    attr1 int
    attr2 string
}

最后,您创建 table:

Db.CreateTable(&Config{})