




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第6章
文件與數據庫操作基本文件操作01操作目錄1.創建目錄2.刪除目錄3.重命名目錄4.遍歷目錄操作目錄1.創建目錄創建目錄使用Mkdir和MkdirAll這兩個函數,Mkdir只能創建單個目錄,而MkdirAll則可以一次性地建好指定路徑下的多級目錄,它們的原型分別如下:funcMkdir(目錄名,權限碼)error //創建單個目錄funcMkdirAll(路徑,權限碼)error //創建多級目錄說明:“目錄名”可帶相對或絕對路徑,為相對路徑時,默認是相對于當前項目目錄的路徑;為絕對路徑時,路徑中的盤符不區分大小寫?!皺嘞薮a”是一個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個參數指定的根路徑開始,按照用戶定義函數的具體功能,遍歷操作其下的各級子目錄?!緦嵗?.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) //直接讀文件這種方式無須事先打開文件,將文件全部內容一次性讀取到內存中,并以一個字節數組的形式返回,對于內容中沒有(或未知)分隔符的文件,使用這種方法處理起來非常方便,但缺點是耗內存,不適合大數據量文件記錄的處理?!緦嵗?.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文檔,內容?!緦嵗?.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函數讀取所有的記錄,每一條記錄是一個字符串的切片,切片中的每個元素代表一個字段?!緦嵗?.10】讀取并顯示上圖所示的CSV文件內容。先將commodity.csv文件放到D:\Go目錄下,再編寫程序代碼如下(csv01.go):運行結果如圖。CSV文件處理2.寫入CSV文件先創建(打開)一個CSV文件,用NewWriter函數在文件句柄上創建一個寫入器,然后以字符串切片的形式構造要寫入的數據記錄,再調用寫入器的Write函數執行寫操作?!緦嵗?.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文件,保存時要指定路徑和文件名?!緦嵗?.12】創建一個Excel文件,向其中寫入用戶信息。程序代碼如下(excel01.go):運行程序后,在D:\Go目錄下生成users.xlsx文件,內容如圖。Excel文件處理3.讀取Excel文件讀取時先用Excelize庫的OpenFile函數打開Excel文件,然后調用文件句柄上的GetRows函數獲取指定名稱表格中的所有行,返回的行存放在一個字符串切片數組中,可以用for-range語句遍歷的方式依次提取出每個單元格的內容?!緦嵗?.13】讀取并顯示上圖所示的Excel文件內容。程序代碼如下(excel02.go):運行結果如圖。第6章
文件與數據庫操作數據庫操作01SQL數據庫操作1.操作MySQL2.操作其他SQL數據庫3.數據持久化SQL數據庫操作1.操作MySQLMySQL是當下最流行的SQL數據庫之一,它最初由瑞典MySQLAB公司開發,由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,一般中小型甚至大型網站的開發都選它作為網站數據庫,使其成為Web應用方面最好的數據庫之一?!緦嵗?.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庫,下面用一個實例演示它的基本用法?!緦嵗?.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萬次的讀寫,性能十分可觀?,F實應用中,數據的查詢要遠多于更新,據統計,一個正常網站日常查詢與更新之比大約是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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 教育素養考試題及答案
- 白酒電商測試題及答案
- 廈門市五顯中學-學年高三政治過關訓練(全社會用現金支付的商品銷售)
- 標準化考評員試題及答案
- 紡織生產質量管理試題及答案
- 護理高級工試題及答案
- 2025年建筑安全員-C證考試(專職安全員)題庫及答案
- 激光技術在水處理中的創新應用試題及答案
- 藥劑處方中常見錯誤問題及答案
- 網絡規劃設計師考試的應試技巧試題及答案
- 殘疾學生送教上門工作手冊
- 北京市某別墅裝修改造工程施工組織設計
- GB/T 17395-2008無縫鋼管尺寸、外形、重量及允許偏差
- 全文《中國式現代化》PPT
- 藥品零售企業許可事項申請表模板
- 必修二英語單詞默寫
- 新人教版四年級數學下冊總復習專題一《四則運算及運算定律》課件
- 宋詞欣賞《虞美人·聽雨》課件
- 混合痔病歷范文
- 110kV線路光纜施工方案及安全管控
- 35KV高壓開關柜買賣合同
評論
0/150
提交評論