Gorm及XML库的使用|青训营笔记

101 阅读2分钟

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的改操作。