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

277 阅读2分钟

这是我参与「第五届青训营 」笔记创作活动的第5天

使用Golang实现XML文件与数据库间的转换-数据库到XML文件

实现功能

  • 通过Golang编程实现对“通讯录”的XML 文档的解析,并把解析结果存到数据库的表中。
  • 进一步实现相反的过程,即将数据库表的内容读出来,并将其转化为XML 文件存储起来

目的

  • 通过实践去熟悉Gorm的使用
  • 这次使用的XML文件格式很简单,主要是为了熟悉Gorm的增删改查
  • 数据库的导出文件后面也会放在项目文件下

具体实现过程

准备工作
  • 数据库建表

  • 安装Gorm并连接数据库

    在项目打开终端安装Gorm

    go get -u gorm.io/gorm
    go get -u gorm.io/driver/sqlite
    

    安装成功后的go.mod文件

image.png

  • 连接数据库

    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("数据库连接失败")
    	}
    
  • 建立与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文件
  • 将所有数据利用gorm读到一个slice中

    func FromDB(db *gorm.DB) []ContactsModel {
    	contacts := make([]ContactsModel, 0)
    	db.Find(&contacts)
    	fmt.Println(contacts)
    	return contacts
    }
    
  • 使用range迭代数据,将每个数据中需要的字段存储到Contact的slice中最后全部放到一个Contacts中

    func ToXMLModel(contacts []ContactsModel) Contacts {
    	c := make([]Contact, 0, len(contacts))
    	for _, v := range contacts {
    		temp := Contact{
    			Name:  v.Name,
    			Sex:   v.Sex,
    			Phone: v.Phone,
    		}
    		c = append(c, temp)
    	}
    	//fmt.Println(c)
    	return Contacts{
    		c,
    	}
    }
    
  • 序列化,存储到文件中

    func ToXML(c *Contacts) error {
    	//data, err := xml.Marshal(c)
    	//fmt.Println(c)
    	data, err := xml.MarshalIndent(c, "", "    ")
    	if err != nil {
    		return err
    	}
    	ioutil.WriteFile("./realize/output.xml", data, 0644)
    	return nil
    }
    
  • 相对于原版的使用Java的dom4j转换,不需要自己一个个去建立节点,只需要定义好对应的结构体就可以直接序列化存储到XML文件中