Go语言程序设计及实例 课件 第6章 文件与数据库操作_第1页
Go语言程序设计及实例 课件 第6章 文件与数据库操作_第2页
Go语言程序设计及实例 课件 第6章 文件与数据库操作_第3页
Go语言程序设计及实例 课件 第6章 文件与数据库操作_第4页
Go语言程序设计及实例 课件 第6章 文件与数据库操作_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6章

文件与数据库操作基本文件操作01操作目录1.创建目录2.删除目录3.重命名目录4.遍历目录操作目录1.创建目录创建目录使用Mkdir和MkdirAll这两个函数,Mkdir只能创建单个目录,而MkdirAll则可以一次性地建好指定路径下的多级目录,它们的原型分别如下:funcMkdir(目录名,权限码)error //创建单个目录funcMkdirAll(路径,权限码)error //创建多级目录说明:“目录名”可带相对或绝对路径,为相对路径时,默认是相对于当前项目目录的路径;为绝对路径时,路径中的盘符不区分大小写。“权限码”是一个4位的八进制数,通常取“0777”,表示创建的目录对所有用户可读写、可执行。这两个函数都返回一个error(错误)类型的值,当执行成功时,值为nil;发生错误时,则可通过这个返回值得到具体的错误信息。例如:err:=os.Mkdir("D:\\Go\\test",0777) //这种必须先建好Go目录

err:=os.MkdirAll("D:\\Go\\test",0777) //这种会自动创建Go目录err:=os.MkdirAll("D:/Go/test",0777) //也可以这样写err:=os.MkdirAll("d:/Go/test",0777) //或者这样写

err:=os.MkdirAll("Go/test",0777) //创建在当前项目目录下

iferr!=nil{ log.Fatal(err) //打印错误日志}操作目录2.删除目录对目录的删除操作同样也有Remove和RemoveAll两个函数,分别对应删除单个目录(即其中没有子目录或文件的目录)和删除多级目录,原型分别为:funcRemove(目录名)error //删除单个目录funcRemoveAll(路径)error //删除多级目录其中,执行第2个函数会删除参数“路径”指定的目录及其下全部文件和子目录。3.重命名目录目录重命名用Rename函数,原型为:funcRename(原目录名,新目录名)error //重命名目录其中,参数中的两个目录名也都可以带相对或绝对路径,默认相对的都是当前项目目录的路径,如果新目录已经存在,则替换它。操作目录4.遍历目录在path包下的filepath子包中,有一个Walk函数可遍历目录,原型为:funcWalk(根路径,自定义函数)error //遍历目录使用时该函数需要用户提供一个自定义函数作为其第2个参数,Walk函数从第1个参数指定的根路径开始,按照用户定义函数的具体功能,遍历操作其下的各级子目录。【实例6.1】目录操作演示。程序代码如下(dir.go):说明:(a)遍历时显示各级目录及其修改时间(通过os.FileInfo中的ModTime函数)。(b)用MkdirAll函数根据当前系统时间依次创建年份、月份、日期对应名称的各级子目录。(c)重命名后的“下载Go学习资源”这个目录下面依然存有原来的年月日各级子目录,所以无法用Remove函数删除,若改用删除多级目录的RemoveAll函数就能成功删除了。操作目录运行结果如图。执行程序后可看到在D盘下生成的目录如图。02文件读写1.创建文件2.打开文件3.写文件4.读文件文件读写1.创建文件创建文件使用Create函数,原型如下:funcCreate(文件名)(*os.File,error) //创建文件说明:“文件名”可带相对或绝对路径,为相对路径时,默认是相对于当前项目目录的路径;为绝对路径时,路径中的盘符不区分大小写。此函数有两个返回值,第1个为指针型,是指向os包File(文件类)对象的句柄,如果创建成功,就可以通过该句柄来对文件执行读写等操作;第2个为error型,创建失败时通过它得到具体的错误信息。如果要创建的文件已经存在,则它会被重置为空白文件。例如://创建在当前项目目录fp,err:=os.Create("./test.txt")fp,err:=os.Create("test.txt") //或者直接写文件名

//创建在本地计算机某个路径下

fp,err:=os.Create("D:\\Go\\test.txt") //必须先在D盘建好Go目录fp,err:=os.Create("D:/Go/test.txt") //也可以这样写fp,err:=os.Create("d:/Go/test.txt") //或者这样写

fmt.Printf("%T",fp) //*os.File

//建好的文件若暂不操作要及时关闭句柄deferfp.Close()文件读写2.打开文件打开文件使用Open或OpenFile函数,原型分别为:funcOpen(文件名)(*os.File,error) //打开文件funcOpenFile(文件名,打开方式,权限)(*os.File,error) //打开文件(底层函数)其中,“文件名”可带相对或绝对路径,写法同创建文件。Open函数的内部实现中调用了更底层的OpenFile函数,当然,用户在编程时也可以直接调用OpenFile函数来设置文件打开方式、操作权限等细节,如:fp,err:=os.OpenFile("D:/Go/test.txt",os.O_CREATE|os.O_RDWR,0666)文件读写3.写文件写文件有两种方法,如下。(1)以字节写入,用Write函数,原型为:func(*os.File)Write(字节数组)(int,error) //以字节写文件使用时,在打开的文件句柄上调用这个函数,将要写的内容先转换为字节数组,再作为参数传给函数,例如:content:=[]byte(“HelloWorld!”) //转换为字节数组if_,err=fp.Write(content);err==nil{ //fp为一个打开的文件句柄 fmt.Println(“写入成功!”)}(2)以字符串写入,用WriteString函数,原型为:func(*os.File)WriteString(字符串)(int,error) //以字符串写文件例如:fp.WriteString(“HelloWorld!”)文件读写4.读文件读文件也有两种方法,如下。(1)通过缓存读取这种方式先要打开文件,用Go语言bufio包的NewReader函数在文件句柄上创建一个读取器,然后调用读取器的ReadString函数,以指定的分隔符分段读取文件内容,代码形式如下:文件句柄,err=os.Open(文件名) //打开文件读取器:=bufio.NewReader(文件句柄) //创建读取器for{

字符串,err:=读取器.ReadString('分隔符') //读取一段内容 iferr==io.EOF{ //到达文件末尾 break } ...//处理(或显示)读到的字符串}文件句柄.Close() //关闭文件文件读写(2)直接读取使用os包的ReadFile函数直接读文件,函数原型为:funcReadFile(文件名)(字节数组,error) //直接读文件这种方式无须事先打开文件,将文件全部内容一次性读取到内存中,并以一个字节数组的形式返回,对于内容中没有(或未知)分隔符的文件,使用这种方法处理起来非常方便,但缺点是耗内存,不适合大数据量文件记录的处理。【实例6.2】文件读写演示。程序代码如下(filerw.go):运行结果如图。文件读写执行程序后可在D盘Go目录下看到该文件,打开可查看其中内容,如图。03文件操作1.复制文件2.移动文件3.修改文件权限文件操作1.复制文件复制文件使用io包的Copy函数,原型如下:funcCopy(目标文件句柄,原文件句柄)(字节数,error) //复制文件说明:复制之前在要存放备份文件的路径下创建目标文件(与原文件可同名或不同名),同时打开原文件,复制过程实际上是对目标文件和原文件句柄(指针)的操作,执行成功后返回复制的字节数。【实例6.3】在D盘Go目录下建立一个“备份”文件夹,将【实例6.2】创建的文件“Go语言.txt”复制到此文件夹下。程序代码如下(copy.go):运行结果如图。执行程序后可在D盘Go目录下看到多了一个“备份”文件夹,其中就有复制后的同名文件,如图。文件操作2.移动文件因Go语言的文件名包含其所处的路径,故对文件的移动实际上是对文件的一种重命名(即修改文件名中的路径)操作,用Rename函数,原型为:funcRename(原文件名,新文件名)error //移动文件【实例6.4】将D盘Go目录下的“Go语言.txt”文件移到其子目录“下载Go学习资源”的最底层目录下。程序代码如下(move.go):packagemainimport( "log" "os")funcmain(){ err:=os.Rename("d:/Go/Go语言.txt","d:/Go/下载Go学习资源/2023/08/01/Go语言.txt") iferr!=nil{ log.Fatal(err) }}文件操作运行后发现原来D盘Go目录下的文件不见了,移到了新的路径下,如图。文件操作3.修改文件权限Go系统使用4位八进制数来表示一个文件(或目录)的访问权限,最高位固定是前导0,后面3位分别表示文件(目录)拥有者、拥有者所在的同组用户、其他组用户对该文件(目录)的权限,而每位八进制数所写成的3个二进制位则代表了3种不同的权限类型(读、写、执行,分别对应字母r、w、x)的状态,1表示具有权限;0表示无权限,故各种可能的权限组合如表。权

限二进制八进制状

态rwx1117可读、可写、可执行rw-1106可读、可写,不能执行r-x1015可读、可执行,不能写r--1004只读-wx0113可写、可执行,不能读-w-0102只可写--x0011只可执行,不能读写---0000无任何权限文件操作例如:八进制

二进制

含义0777 0111111111 拥有者、同组用户、其他组用户都具有完全的读、写和执行权限0666 0110110110 拥有者、同组用户、其他组用户都具有读写权限,但不能执行0755 0111101101 拥有者有完全权限,而同组及其他组用户只有读和执行权限,不能写0754 0111101100 拥有者有完全权限,同组用户有读和执行权限,其他组用户只能读用os包的Stat函数可查看文件当前的权限组合状态,原型为:funcStat(文件名)(FileInfo,error) //查看文件权限该函数返回一个FileInfo对象实例,其中存有权限状态信息,可通过调用其Mode方法获取信息内容。用os包的Chmod函数可修改文件的权限,原型为:funcChmod(文件名,权限值)error //修改文件权限其中,“权限值”就是用前述4位八进制数表示的权限状态。文件操作【实例6.5】修改备份的“Go语言.txt”文件的访问权限为对任何用户都只读。程序代码如下(chmod.go):packagemainimport( "fmt" "log" "os")funcmain(){ finf,err:=os.Stat("D:/Go/备份/Go语言.txt") iferr!=nil{ log.Fatal(err) } fmt.Println("原有权限:",finf.Mode()) os.Chmod("D:/Go/备份/Go语言.txt",0444) finf,err=os.Stat("D:/Go/备份/Go语言.txt") fmt.Println("修改后为:",finf.Mode())}文件操作运行结果如图。此时去到D盘“Go\备份”目录下右击文件“Go语言.txt”,选择“属性”打开其属性对话框,可看到底部的“只读”选项已打上勾,说明权限修改成功,如图。第6章

文件与数据库操作特殊文件处理01XML文件处理XML文件处理在Go程序中,用结构体(struct)来表达XML的标签及其层次关系。先将整个XML定义成一个结构体,第一个名称为XMLName(xml.Name类型)的字段对应XML文档的根标签,根标签下面的每个一级子标签对应一个字段;如果子标签又有嵌套的次级标签,则针对这个子标签再定义一个结构体(用其下次级标签作为其字段),并以此结构体类型作为该子标签字段的类型,…,以此类推;对于包含属性的标签,属性也要定义为结构体的一个字段,标注以“attr”。例如,有如下结构的一个XML文档:<?xmlversion="1.0"encoding="UTF-8"?><根标签><标签1>值1</标签1><标签2属性="值">值2</标签2>...<标签i><标签i1>值i1</标签i1><标签i2>值i2</标签i2>...<标签in>值in</标签in></标签i>...<标签n>值n</标签n></根标签>XML文件处理其对应的Go程序中的结构体定义如下:type结构体1struct{ //整个XML定义成一个结构体1 XMLNamexml.Name`xml:"根标签"`

字段1类型1`xml:"标签1"`

字段2类型2`xml:"标签2"`

字段2a类型2a`xml:"属性,attr"` //属性也要定义为一个字段并标注“attr” ...

字段i结构体2`xml:"标签i"` //标签i的类型是结构体2 ...

字段n类型n`xml:"标签n"`}

type结构体2struct{ //对有嵌套的标签i再定义一个结构体2

字段i1类型i1`xml:"标签i1"`

字段i2类型i2`xml:"标签i2"` ...

字段in类型in`xml:"标签in"`}XML文件处理Go语言的xml包用于处理XML文件,下面介绍其中相关的几个函数。(1)XML数据生成用Marshal或MarshalIndent函数生成XML数据,两个函数的原型为:funcMarshal(interface{})(字节数组,error)funcMarshalIndent(interface{},前缀符,缩进符)(字节数组,error)说明:这两个函数的第1个参数都是空接口,因为任何类型的数据都可以赋值给空接口,所以只要用户将定义好的结构化数据传给这个参数,函数就能自动将其转化为XML类型的数据并以字节数组的形式返回,程序将返回的字节数据写入文件就生成了XML格式的文档。(2)XML数据解析对已有XML文档内容的解析使用Unmarshal函数,它接收程序读取的XML文件字节数据,转换为用户定义好的结构体对象,原型为:funcUnmarshal(字节数组,interface{})errorXML文件处理【实例6.6】设计并生成一个存储某网站系统用户信息的XML文档。程序代码如下(xml01.go):运行程序后,就在D:\Go目录下生成了users.xml文档,内容。【实例6.7】读取并解析显示上例所生成的XML文档内容。程序代码如下(xml02.go):运行结果如图。02JSON文件处理JSON文件处理JSON(JavaScriptObjectNotation)是当今互联网上应用最广泛的一种轻量级数据交换格式,它采用一组键值对来表示数据对象,用大括号括起来,形如:{"键1":值1,"键2":值2,...,"键n":值n}其中,所有的键上必须加双引号,键与值之间以冒号分隔,值可以是任意类型的数据,甚至又可以是一个JSON对象,构成JSON对象的嵌套。Go同样也是用结构体来描述JSON对象,将其每个键都定义成结构体的字段,对于嵌套的JSON对象则要单独再定义一个结构体。例如,有一个JSON对象结构如下:{ "键1":值1, "键2":值2, ... "键i":{ "键i1":值i1, "键i2":值i2, ... "键in":值in, }, ... "键n":值n}JSON文件处理其对应的Go程序中的结构体定义如下:type结构体1struct{ //JSON对象定义成一个结构体1

字段1类型1`json:"键1"`

字段2类型2`json:"键2"` ...

字段i结构体2`json:"键i"` //键i对应的值i的类型是结构体2 ...

字段n类型n`json:"键n"`}

type结构体2struct{ //对嵌套的JSON对象再定义一个结构体2

字段i1类型i1`json:"键i1"`

字段i2类型i2`json:"键i2"` ...

字段in类型in`json:"键in"`}JSON文件处理【实例6.8】生成一个存储用户信息的JSON对象。程序代码如下(json01.go):运行程序后,在D:\Go目录下生成user.json文件,打开可看到生成的JSON对象如图。JSON文件处理【实例6.9】读取并解析显示上例所生成的JSON对象。程序代码如下(json02.go):运行结果如图。03CSV文件处理1.读取CSV文件2.写入CSV文件CSV文件处理CSV文件以纯文本形式存储表格数据,行之间以换行符分隔,每行由列(又称字段)组成,通常所有记录具有完全相同的列顺序,列间常用逗号或制表符进行分隔。例如,一个存储商品记录的CSV文件(commodity.csv)内容如图。CSV文件处理1.读取CSV文件先打开要读的CSV文件,用NewReader函数在文件句柄上创建一个读取器,然后调用读取器的ReadAll函数读取所有的记录,每一条记录是一个字符串的切片,切片中的每个元素代表一个字段。【实例6.10】读取并显示上图所示的CSV文件内容。先将commodity.csv文件放到D:\Go目录下,再编写程序代码如下(csv01.go):运行结果如图。CSV文件处理2.写入CSV文件先创建(打开)一个CSV文件,用NewWriter函数在文件句柄上创建一个写入器,然后以字符串切片的形式构造要写入的数据记录,再调用写入器的Write函数执行写操作。【实例6.11】创建一个CSV文件,向其中写入用户记录。程序代码如下(csv02.go):运行程序后,在D:\Go目录下生成users.csv文件,内容如图。04Excel文件处理1.安装Excelize库2.写入Excel文件3.读取Excel文件Excel文件处理1.安装Excelize库Excelize是一款开源的Go语言库,提供了读取、写入和操作Excel文件的API,可以轻松地完成Excel文件的处理。以管理员身份打开Windows命令行,开启gomodule,再用goinstall命令安装Excelize库的最新版本,先后输入如下:goenv-wGO111MODULE=ongoinstall/360EntSecGroup-Skylar/excelize@latest命令行窗口显示如图。Excel文件处理2.写入Excel文件先用NewFile函数创建一个Excel文件,该函数返回文件(File)类型的指针,再通过调用指针的SetCellValue函数向Excel指定表格的特定单元格中写入值,SetCellValue函数原型为:SetCellValue(表格,单元格,值)其中,前两个参数确定要写入表格和单元格的名称,都是字符串型;第3个参数则是个空接口,可接受任意类型的数据值。写入完成后,用SaveAs函数保存Excel文件,保存时要指定路径和文件名。【实例6.12】创建一个Excel文件,向其中写入用户信息。程序代码如下(excel01.go):运行程序后,在D:\Go目录下生成users.xlsx文件,内容如图。Excel文件处理3.读取Excel文件读取时先用Excelize库的OpenFile函数打开Excel文件,然后调用文件句柄上的GetRows函数获取指定名称表格中的所有行,返回的行存放在一个字符串切片数组中,可以用for-range语句遍历的方式依次提取出每个单元格的内容。【实例6.13】读取并显示上图所示的Excel文件内容。程序代码如下(excel02.go):运行结果如图。第6章

文件与数据库操作数据库操作01SQL数据库操作1.操作MySQL2.操作其他SQL数据库3.数据持久化SQL数据库操作1.操作MySQLMySQL是当下最流行的SQL数据库之一,它最初由瑞典MySQLAB公司开发,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型甚至大型网站的开发都选它作为网站数据库,使其成为Web应用方面最好的数据库之一。【实例6.14】在MySQL中创建一个人员信息数据库myperson,编写Go程序对其进行一系列操作,如下。(1)在数据库中创建人员信息表person,包含3个字段:name(姓名)、age(年龄)、score(得分)。(2)往person表中录入如下3条记录:周何骏4098.5周骁珏1361.5Jack1595.0(3)对表中数据执行增删改等各类操作,先后包括:①将“周何骏”的年龄减20;②将“周骁珏”名字改为“周骁瑀”,得分改为“99”;③对表中所有人员的得分统一加上1;④删除得分小于100的人员记录。(4)在以上每一步操作之后都要求对表中所有人员的信息进行查询和显示。SQL数据库操作开发步骤如下。(1)安装MySQL从Oracle官网下载MySQL安装包可执行程序,双击启动向导,按照向导界面指引安装;或者下载MySQL压缩包,手动编写配置文件,通过Windows命令行安装MySQL服务。详细过程请读者参考网上资料或MySQL相关书籍,本书不展开。(2)创建数据库安装好MySQL后,再安装一个可视化操作工具(笔者用的是NavicatPremium),创建数据库myperson,执行如下SQL语句:CREATEDATABASEmyperson;SQL数据库操作(3)安装MySQL驱动以管理员身份打开Windows命令行,开启gomodule,再用goinstall命令安装MySQL的驱动程序,先后输入如下:goenv-wGO111MODULE=ongoinstall/go-sql-driver/mysql@latest命令行窗口显示如图。SQL数据库操作(4)编写程序程序代码如下(mysql.go):运行结果如图。SQL数据库操作用NavicatPremium连接MySQL,可看到其中创建的数据库、表及当前的人员记录,如图。SQL数据库操作1)SQLiteSQLite是一款轻型的嵌入式数据库,由D.RichardHipp开发,它被包含在一个相对小的C库中,可嵌入到很多现有的操作系统和程序语言中。SQLite占用资源非常低,在一些嵌入式设备中,可能只需要几百K的内存就够了,广泛支持Windows、Linux、Unix等主流操作系统,同时能够跟很多种高级程序语言(如Python、C#、PHP、Java等)相结合,Go语言也将SQLite作为其内置数据库,来支持用户完成一些简单的快速数据存储任务。SQLite第一个Alpha版本诞生于2000年5月,目前已升级至SQLite3,Go内部集成了SQLite3,无须单独安装。(1)安装驱动虽然GO自带SQLite,但其驱动仍然用的是第三方包,需要在线安装。以管理员身份打开Windows命令行,开启gomodule,再用goinstall命令安装SQLite的驱动,输入如下:goinstall/mattn/go-sqlite3@latestSQL数据库操作(2)使用驱动安装好驱动后,在程序开头导入:import( "database/sql" "fmt" _"/mattn/go-sqlite3" //SQLite的驱动包 "log")然后将创建连接的语句改写为:mydb,err:=sql.Open("sqlite3","./myperson")其他代码不变,就可以实现与前面操作MySQL实例程序完全相同的功能。SQL数据库操作2)PostgreSQLPostgreSQL是从加州大学伯克利分校计算机系开发的POSTGRES系统基础上发展而来的数据库。经过十几年的发展,PostgreSQL已经成为一个功能强大的对象关系数据库管理系统。它完全免费,不受任何公司或其他私人实体控制,是当今世界上可以获得的最先进的开放源码的数据库系统,并且是跨平台的,可以在许多操作系统上运行,包括Windows、Linux、FreeBSD、MACOSX和Solaris等。在开源数据库领域,PostgreSQL甚至成为了与MySQL相媲美的另一种选择。(1)安装PostgreSQLPostgreSQL下载地址为/download/windows/,下载获得可执行(.exe)文件,双击会自动安装环境所需的Windows组件并启动安装向导,按向导的指引操作,在“Password”和“Port”界面设置连接数据库的密码和端口,PostgreSQL默认的用户是“postgres”、端口是“5432”,一般都无须改动。SQL数据库操作(2)创建数据库PostgreSQL自带pgAdmin4管理器,可通过Windows开始菜单中的项启动,它具有基于Web的图形界面,用于可视化地操作PostgreSQL数据库,初次启动需要输入安装时设置的密码登录。登录后展开窗口左侧浏览器树状视图,右击“Databases”→“Create”→“Database...”项,在弹出对话框的“Database”栏输入数据库名“myperson”,点“Save”按钮创建人员信息数据库,如图。SQL数据库操作(3)安装驱动支持GO语言操作PostgreSQL的第三方包有很多,其中比较主流的是/lib/pq驱动包,在Windows命令行中开启gomodule,用goinstall命令在线安装它,输入:goinstall/lib/pq@latest(4)使用驱动安装好驱动后,在程序开头导入:import( "database/sql" "fmt" _"/lib/pq" //PostgreSQL的驱动包 "log")然后将创建连接的语句改写为:mydb,err:=sql.Open("postgres","host=localhostport=5432user=postgrespassword=123456dbname=mypersonsslmode=disable")SQL数据库操作(5)修改代码只要将程序向person表录入记录的语句改写为:mydb.Exec("INSERTINTOpersonVALUES($1,$2,$3),($4,$5,$6),($7,$8,$9)","周何骏",40,98.5,"周骁珏",13,61.5,"Jack",15,95.0) //SQL语句参数占位符由?改为$n其他代码不变,就可以实现与前面操作MySQL实例程序完全相同的功能。运行程序后,可通过pgAdmin4查看数据库,展开窗口左侧浏览器树状视图的“Databases”→“myperson”→“Schemas”→“public”→“Tables”项,可见其下的person表,右击此表,在弹出快捷菜单中选“View/EditData”→“AllRows”,显示表中记录,如图。SQL数据库操作3)SQLServer除了开源领域的数据库,Go对大型商用数据库的支持也很给力,这里以IT巨头微软的著名数据库产品SQLServer为例说明。(1)安装SQLServer过程略,请读者参考微软官方文档或SQLServer相关书籍,本书不展开。(2)创建数据库启动SQLServerManagementStudio可视化管理器登录SQLServer,展开窗口左侧对象资源管理器中的树状视图,右击“数据库”→“新建数据库”项,在弹出对话框的“数据库名称”栏输入数据库名“myperson”,点“确定”按钮创建人员信息数据库,如图。SQL数据库操作(3)安装驱动以管理员身份打开Windows命令行,开启gomodule,用goinstall命令安装SQLServer的驱动,输入如下:goinstall/denisenkom/go-mssqldb@latest(4)使用驱动安装好驱动后,在程序开头导入:import( "database/sql" "fmt" _"/denisenkom/go-mssqldb" //SQLServer的驱动包 "log")然后将创建连接的语句改写为:mydb,err:=sql.Open("mssql","server=localhost;userid=sa;password=123456;port=1433;database=myperson;")SQL数据库操作运行程序后,可通过SQLServerManagementStudio查看数据库,展开窗口左侧对象资源管理器中的树状视图“数据库”→“myperson”→“表”项,可见其下的dbo.person表,右击此表,在弹出快捷菜单中选“编辑前200行”,显示表中记录,如图。SQL数据库操作3.数据持久化Go语言也有很多支持它的持久层框架,其中比较主流的是Gorm,它是一款性能极佳的ORM库,下面用一个实例演示它的基本用法。【实例6.15】通过Gorm框架操作MySQL数据库,实现对人员信息的增删改查,功能同前面的【实例6.14】。开发步骤如下。(1)安装Gorm框架以管理员身份打开Windows命令行,开启gomodule,再用goinstall命令安装Gorm框架,输入如下:goinstall/jinzhu/gorm@latest(2)编写程序程序代码如下(gorm.go):SQL数据库操作说明:(a)要在程序中使用Gorm框架,必须先针对数据库中的表定义结构体,结构体与表的字段存在一一对应关系,以“`json:"表字段名"`”声明,形式如下:type类型名struct{

字段1类型1`json:"表字段1"`

字段2类型2`json:"表字段2"` ...

字段n类型n`json:"表字段n"`}定义好结构体之后,在程序中调用AutoMigrate方法,框架就能根据结构体类型自动在MySQL中创建对应的表,表名按照驼峰命名法拆分结构体类型名后生成,后半段会转为英文复数,例如:结构体类型名

转换后的表名MyUser my_usersGPerson g_people(因为英文单词person的复数是people)SQL数据库操作(b)Gorm连接数据库的方式与database/sql接口在形式上完全一样,也是向Open方法传入驱动名和连接字符串,如下:连接名,错误:=gorm.Open(驱动名,连接字符串) //创建连接但该方法是Gorm框架库中的Open方法,它所返回的是一个指向gorm.DB类型的指针,通过该指针可以调用框架的Save、Update/Updates、Delete等方法以对象化的方式操作数据。(c)语句“err:=db.Find(&rs).Error”通过框架的Find方法查询数据库中所有人员的信息,所得到的结果集(rs)是一个由查到的人员记录对象(GPerson类型)构成的切片,查询时也可以用Where方法构造查询条件,例如,若将这句改为下面两条带查询条件的语句,将会得到如图所示的结果:err:=db.Where("age<?",20).Find(&rs).Error //①年龄小于20的人员记录err:=db.Where("score>90").Find(&rs).Error //②得分大于90的人员记录

①年龄小于20的人员记录

②得分大于90的人员记录SQL数据库操作(3)运行程序运行结果如图。用NavicatPremium可查看Gorm框架在MySQL中自动创建的表及其中的人员记录,如图。02NoSQL数据库操作1.操作MongoDB2.操作RedisNoSQL数据库操作1.操作MongoDB1)MongoDB简介与传统关系数据库不同,MongoDB中数据存储的基本形式不是表而是集合(Collection),对数据的操作也不是用SQL语句,而是通过调用集合对象的方法。在GO语言中对MongoDB集合有如下这些操作方法:集合对象.InsertOne(参数) //插入数据集合对象.InsertMany(参数) //批量插入集合对象.Find(参数) //查询数据集合对象.UpdateOne(参数) //更新数据集合对象.UpdateMany(参数) //批量更新集合对象.DeleteMany(参数) //删除数据MongoDB是一种面向文档存储的数据库,集合中的数据被存储为一个个文档,这里的“文档”类同于关系数据库表中的“记录”,但文档的结构类似于JSON对象,由键值对组成,形如:{ "键1":值1, "键2":值2, ... "键n":值n}NoSQL数据库操作在MongoDB内部对文档采用一种叫做BSON的编码形式,它扩展了JSON的表达能力,不只是将数据存储为简单字符串和数字,还可包含额外的类型,如int、long、date、浮点数和decimal128等,这使得应用程序能够更容易地处理、排序和比较数据。Go用D和Raw两大类型来表示BSON数据。其中,D类型被用来构造使用本地Go类型的BSON对象,又包括4种,如下。(1)D:一个BSON文档。(2)M:一个无序的映射(map)。它与D是一样的,只是不保持顺序。(3)A:一个BSON数组。(4)E:D中的一个元素。另一种Raw类型则被用于验证字节切片或者从原始类型检索单个元素。本书只涉及D类型的应用。要使用BSON,需要在程序开头导入下面的包:import"/mongo-driver/bson"NoSQL数据库操作然后就可以在代码中以bson.D{...}、bson.M{...}的形式封装BSON数据。Go程序操作MongoDB的基本方式是,在调用集合对象的方法时通过参数指明要检索的键值和要执行的操作类型及内容,参数皆是以BSON封装的文档形式给出,写成如下:集合对象.方法名(上下文,bson.M{条件},bson.M{"类型代码":操作内容})其中,“条件”就相当于关系数据库SQL操作中由“WHERE”子句指明的部分,表示要对集合中符合哪些条件的文档执行这个操作,如果写成“bson.D{}”或“bson.M{}”则表示是对所有文档的操作;“操作内容”是需要插入、修改、删除的具体数据内容,同样也是以BSON封装的文档形式给出;“类型代码”给出了操作动作或条件的代码,在MongoDB中是由不同的字符串标识定义的,一些常用代码的含义见表。标识代码含

义$set对键值设置更新$inc键值上加减一个常数$lt对键值小于某值的文档操作$lte对键值小于或等于某值的文档操作$gt对键值大于某值的文档操作$gte对键值大于或等于某值的文档操作$eq对键值等于某值的文档操作$ne对键值不等于某值的文档操作NoSQL数据库操作例如:集合.UpdateOne(上下文,bson.M{"name":"周何骏"},bson.M{"$inc":bson.M{"age":-20}}) //将name(姓名)为“周何骏”的文档的age(年龄)减20

集合.Find(上下文,bson.D{}) //查询集合中的所有文档

集合.UpdateMany(上下文,bson.M{},bson.M{"$inc":bson.M{"score":1}}) //对集合中所有文档的score(得分)加1

集合.DeleteMany(上下文,bson.M{"score":bson.M{"$lt":100}}) //删除集合中score(得分)小于100的文档NoSQL数据库操作2)MongoDB安装本书所用的MongoDB为4.0版,下载地址为/download-center#community,下载获得的安装包文件名为mongodb-win32-x86_64-2008plus-ssl-4.0.1-signed.msi,双击启动安装向导,如图。NoSQL数据库操作安装过程很简单,跟着向导的指引往下操作就可以了,但有一点要注意:由于MongoDB在其安装包中默认会启动“MongoDBCompass”组件的安装,但该组件却并不包含在MongoDB的安装包内,向导会主动联网去从第三方获取它,而这个组件实际上目前还无法通过网络渠道获得,故向导程序会锁死在安装进程上无限期地等待下去,导致安装过程无法结束,如图。NoSQL数据库操作为避免出现这样的困境,读者在安装的时候要在向导选择安装类型的界面上单击“Custom”(定制)按钮,在下一个界面上取消勾选底部的“InstallMongoDBCompass”复选框,如图所示。NoSQL数据库操作3)MongoDB操作实例【实例6.16】编写Go程序在MongoDB中创建人员信息数据库myperson并进行一系列操作,功能同前面的【实例6.14】。开发步骤如下。(1)安装MongoDB驱动以管理员身份打开Windows命令行,开启gomodule,再用goinstall命令安装MongoDB的驱动程序,输入如下:goinstall/mongo-driver/mongo@latest(2)编写程序程序代码如下(mongo.go):说明:连接MongoDB的机制与前面介绍的各种SQL数据库都不一样,必须先用“options.Client().ApplyURI(...)”语句配置连接选项,其中需要指明连接端口,MongoDB默认的端口是27017。在配置好连接选项后,调用mongo.Connect函数返回一个mongo.Client类型的MongoDB客户端指针,再用如下语句获取要操作的集合:客户端.Database(数据库名).Collection(集合名)NoSQL数据库操作(3)运行程序运行结果如图。用NavicatPremium连接MongoDB,可看到其中创建的数据库、集合及当前的人员文档,如图。NoSQL数据库操作2.操作Redis1)Redis简介Redis是一种运行在内存的数据库,它是开源的、使用ANSIC语言编写、遵守BSD协议、支持网络、并提供多种语言的API。由于Redis是基于内存的,所以它的运行速度很快(大约是关系数据库几倍到几十倍),在已报道的某些测试中,甚至可以完成每秒10万次的读写,性能十分可观。现实应用中,数据的查询要远多于更新,据统计,一个正常网站日常查询与更新之比大约是9:1到7:3,若是将常用的数据存储在Redis中来代替关系数据库的査询访问,将可以大幅提高网站的性能。NoSQL数据库操作Redis拥有十分丰富的应用场景,主要如下:计数器电商APP商品的浏览量、短视频APP视频的播放次数等信息都会被统计,以便用于运营或产品市场分析。为了保证数据实时生效,对用户的每一次浏览都得计数,这会导致非常高的并发量。这时可以用Redis提供的incr命令来实现计数器功能,由于一切操作都在内存中进行,所以性能极佳。社交互动使用Redis提供的散列、集合等数据类型,可以很方便地实现网站(或APP)中的点赞、踩、关注共同好友等社交场景的基本功能。排行榜可以利用Redis提供的有序集合数据类型实现各种复杂的排行榜应用,如京东、淘宝的销量榜,将商品按时间、销量排行等。最新列表Redis可以通过LPUSH在列表头部插入一个内容ID作为关键字,通过LTRIM限制列表的数量,这样列表永远为

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论