为何GORM执行CreateTable时忽略了结构体字段?
问题原因与解决方案
嗨,这问题我熟!GORM之所以忽略了Config结构体,核心原因是你的Config结构体里的字段都是小写开头的。
在Go语言中,小写开头的字段属于包私有字段,外部包(比如GORM)无法通过反射机制访问到这些字段。GORM在处理结构体时,会扫描所有公开(大写开头)的字段来生成数据库列;如果一个结构体里没有任何可被访问的公开字段,GORM就会认为这个结构体没有需要持久化的内容,自然不会在数据库表中创建对应的列啦。
修复方案
只需要把Config结构体里的字段改成大写开头(公开字段)就行,要是你希望序列化后的JSON字段保持小写,可以加上json标签:
type Config struct { Attr1 int `json:"attr1"` Attr2 string `json:"attr2"` }
修改完代码后,重新运行你的程序,再查看test.db的表结构,就能看到bs表已经多出了config字段:
sqlite> .schema CREATE TABLE "as" ("id" integer primary key autoincrement ); CREATE TABLE "bs" ("id" integer primary key autoincrement,"a_id" integer,"config" text );
这样GORM就能正确识别Config结构体,并把它序列化成JSON字符串存储到config这个text类型的列里啦。
内容的提问来源于stack exchange,提问作者h10g
相关产品推荐
相关产品推荐

