iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 22
1
Software Development

Go Phishing!30 天用 Go 實作 Reverse Proxy 之釣魚大作戰系列 第 22

Day22-收網 II(讀寫資料)

今日目標

昨天完成了 db.Connect() 用來建立跟資料庫的連線,今天要實作的是最重要的 讀/寫 資料庫

寫入資料庫

這邊要實作 db.Insert 負責把單筆資料寫入資料庫:在 LedisDB 裡每個 list(array)都要有一個名字(key),幫這個 list 取名叫做 fishes,然後把字串加到 list 裡面,這樣就完成了 db.Insert

這邊用到的 db.RPush 功能是把元素加到 list 裡面,類似 JS 的 array.push(elem) 還有 Python 的 list.append(elem)

var db *ledis.DB

func Insert(s string) {
    // fishes 是這個 list 的名字(key)
    fishes := []byte("fishes")
    
    // 把字串 s 加到 fishes 裡面
    db.RPush(fishes, []byte(s))
}

讀取所有資料

讀取的部分稍微複雜一點,要先取得 list 的長度然後取出所有資料,最後再把每一筆資料都轉成 string 回傳

這邊會用到兩個 LedisDB 的功能:db.LLen 用來取得 list 的長度,類似某些語言的 len(list)list.length,而 db.LRange 則是用來取得某個範圍內的元素,搭配 list 長度就可以拿到所有元素

func SelectAll() []string {
    fishes := []byte("fishes")
    
    // 取得 list 的長度 -> nFish
    nFish, err := db.LLen(fishes)
    
    // 從 list 裡面取得所有資料
    datas, err := db.LRange(fishes, 0, int32(nFish))

    // 因為取出來的每一筆資料型別都是 []byte
    // 把每筆資料都轉成 string 放到 strs 裡面
    strs := []string{}
    for _, data := range datas {
        strs = append(strs, string(data))
    }

    return strs
}

在 main 中使用

實際測試一下,先新增兩個字串到資料庫內,然後一次用 for loop 印出來

func main() {
    db.Connect()
    db.Insert("Hello World")
    db.Insert("I'm Larry Lu")
    for _, str := range db.SelectAll() {
        fmt.Println(str)
    }
}

小結

今天完成了 讀/寫 資料庫,commit 放在這裡,其實還有很多功能(ex 清空資料庫)可以自己實作看看,有任何問題都歡迎提問,沒問題的話明天就要用今天寫好的這兩個 function 來 儲存/讀取 帳號密碼了~

參考資料

LedisDB API


上一篇
Day21-收網 I(連接資料庫)
下一篇
Day23-收網 III(簡單瀏覽介面)
系列文
Go Phishing!30 天用 Go 實作 Reverse Proxy 之釣魚大作戰30

尚未有邦友留言

立即登入留言