为什么 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{})
我使用的是哪个版本的 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{})