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

时间:2018-05-18 07:19:39

标签: go go-gorm

我使用的是什么版本的Go(go version)?

Go version 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&#39 {s} config属性未创建。 那么为什么Gorm忽略了Config结构?

1 个答案:

答案 0 :(得分: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{})