Почему Gorm игнорирует структуру, когда CreateTable? - PullRequest
0 голосов
/ 18 мая 2018

Какую версию Go я использую (go version)?

Версия Go Go 1.9.1 Linux / amd64

Какую базу данных и ее версию я использую?

sqlite3

Полная работоспособная программа для воспроизведения моей проблемы:

Требуется запуск с помощью Докер GORM для создания конфигурации или укажите свою конфигурацию.

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 );

Как мы видим, атрибут config B не был создан.Так почему же Горм игнорирует структуру Config?

1 Ответ

0 голосов
/ 18 мая 2018

Ваши данные не нормированы.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{})
...