首页 文章

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

提问于
浏览
0

我正在使用什么版本的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的模式是

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 结构?

1 回答

  • 1

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

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

    然后在 Config 中定义外键:

    type Config struct {
        BID   int
        attr1 int
        attr2 string
    }
    

    最后,您创建表:

    Db.CreateTable(&Config{})
    

相关问题