Gorm及XML库的使用|青训营笔记——将数据从XML文件写到数据库
这是我参与「第五届青训营 」笔记创作活动的第6天
这篇的内容是接上一篇(使用Golang实现XML文件与数据库间的转换-数据库到XML文件),文章地址:文章地址
- 这篇文章和上一篇是两个模块,具体方法的实现关联不是很大,这里先将上一篇中提到的结构体定义展现出来
xml对应的结构体
type Contacts struct {
C []Contact `xml:"contact"`
}
type Contact struct {
Name string `xml:"name"`
Sex string `xml:"sex,attr"`
Phone string `xml:"phone"`
}
复制代码
数据库表对应的结构体
type ContactsModel struct { //定义与数据库字段相对应的结构体
gorm.Model
Name string
Sex string
Phone string
}
func (*ContactsModel) TableName() string {
return "go_xml"
}
复制代码
这里使用的gorm.Model是gorm库提供的,放在这里其实没有必要,可以直接改为主键ID
这里与数据库对应的结构体实现了TableName接口,如果不实现该接口,gorm会默认使用该结构体的蛇形复数(contact_models)做为表名。
在这两个结构体中,字段名的首字母一定要大写,否则可能会导致写入数据失败(因为在Golang中首字母小写表示这个属性只能在同一个包中能被看见)
-
将数据从XML文件写到数据库
使用ioutil库和XML库的Unmarshal方法
//读入文件并序列化 file, err := ioutil.ReadFile(filePath) if err != nil { return err } var c = Contacts{} err1 := xml.Unmarshal(file, &c) if err1 != nil { return err1 } -
将数据写到对应的数据库struct中
//将数据写到对应的数据库struct中 var contacts = make([]ContactsModel, 0, len(c.C)) for _, v := range c.C { contacts = append(contacts, ContactsModel{ Name: v.Name, Sex: v.Sex, Phone: v.Phone, }) }结构体的其余字段gorm会自动填充(deleted_at的值默认为null)
-
将数据写到数据库
db.Model(&ContactsModel{}).Create(&contacts)小结
-
到这里,我们的实现已经初步完成了,这是我们在main方法中调用函数,将input.xml文件先写到数据库,在将文件读出来。
func main() { dsn := "root:2515426141@tcp(127.0.0.1:3306)/xml?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { panic("数据库连接失败") } realize.ToDB(db, "./realize/input.xml") realize.DoFromDB(db) }去查询数据库表已经查看新生成的realize/output.xml文件功能已经初步实现成功。
-
但是还有一些问题,例如有两个相同的电话号码存入,这样显然是要经过处理的,这个就需要用到gorm的改操作。