第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在Go中實現(xiàn)基本的ORM

在Go中實現(xiàn)基本的ORM

Go
炎炎設(shè)計 2021-05-04 17:53:39
我正在嘗試為我正在處理的數(shù)據(jù)應(yīng)用程序設(shè)計基本的ORM。關(guān)于我想出的模型的問題有兩個:這是數(shù)據(jù)庫跟蹤的“最佳”,“最高效”模型嗎?這是慣用的Go嗎?這個想法是在應(yīng)用程序啟動時將數(shù)據(jù)庫的完整模型加載到內(nèi)存中。使用此模型來生成具有每個對象的crc32哈希值的映射(對應(yīng)于數(shù)據(jù)庫中的一行)。這就是我們用來與模型進行比較的原因,以專門查找在調(diào)用.save()時進行了哪些更改。以下內(nèi)容的第一部分生成crc32映射,第二部分引入隨機更改,最后一部分將是.save()的一部分,以將db更改寫入磁盤編碼:func main() {    // Read data off of disk into memory    memDB := ddb    // Create hash map of memDB    peopleMap := make(map[int]uint32)    for _, v := range memDB.people {        // make row into byte array, looks kludgy        hash := []byte(fmt.Sprintf("%#v", v))        peopleMap[v.pID] = crc32.ChecksumIEEE(hash)        fmt.Printf("%v: %v %v \t(%v %v) - crc sum: %v\n",            v.pID, v.fName, v.lName, v.job, v.location,            peopleMap[v.pID])    }    fmt.Println("\n# of people in memory:", len(memDB.people))    // Sometime later, we need to delete Danielle, so    // Delete in memory:    var tmpSlice []ddPerson    for _, v := range memDB.people {        if v.fName == "Danielle" {            continue        }        tmpSlice = append(tmpSlice, v)    }    memDB.people = tmpSlice    fmt.Println("# of people in memory:", len(memDB.people))    // Okay, we save in-memory representation mem.DB back    // to disk with some kind of .save() assertion    // a len(peopleMap) comparison to len(memDB.people) will    // tell us there has been a change for INSERTS and    // DELETES, but it won't tell us about updates or which    // record was inserted or deleted    // First, check for additions    if len(peopleMap) < len(memDB.people) {        // Code to find and add person to disk db ddb here        fmt.Println("Adding someone to disk database...")    } else if len(peopleMap) > len(memDB.people) {        // Check for deletions        fmt.Println("Purging someone from disk database...")    }在以下位置有可用的版本:http : //play.golang.org/p/XMTmynNy7t
查看完整描述

2 回答

?
浮云間

TA貢獻1829條經(jīng)驗 獲得超4個贊

您已經(jīng)實現(xiàn)了數(shù)據(jù)庫的內(nèi)存緩存,這與ORM并不是完全一樣的。

您所擁有的東西有幾個問題:

  • 如果某個其他進程/應(yīng)用程序曾經(jīng)修改過數(shù)據(jù)庫,則您的內(nèi)存模型將過時。因為您不知道緩存是過時的,所以這可能會導(dǎo)致您對數(shù)據(jù)庫的破壞性寫入。

  • 如果數(shù)據(jù)庫變大,您的應(yīng)用程序?qū)⑾鄳?yīng)變大。

大多數(shù)ORM提供了一種將類型(例如結(jié)構(gòu))映射到數(shù)據(jù)庫讀寫的方法。這使您可以從數(shù)據(jù)庫中讀取單個對象并對其進行修改,然后將該對象寫回到數(shù)據(jù)庫中。這可能是一個更好的方法。

至于您的慣用語言,我沒有看到明顯的非慣用語言,但是也沒有太多事情要做。最上面memDb := ddb是一個函數(shù)調(diào)用,但是后面沒有括號。這是語法錯誤。


查看完整回答
反對 回復(fù) 2021-05-17
  • 2 回答
  • 0 關(guān)注
  • 221 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號