最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

更換GORM默認(rèn)SQLite驅(qū)動(dòng)出現(xiàn)的問(wèn)題解決分析

 更新時(shí)間:2024年02月01日 14:12:12   作者:sample?SK?剎客網(wǎng)絡(luò)科技資訊  
這篇文章主要為大家介紹了更換GORM默認(rèn)SQLite驅(qū)動(dòng)出現(xiàn)的問(wèn)題解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

GORM簡(jiǎn)介

GORM 是 Go 語(yǔ)言中最受歡迎的 ORM 庫(kù)之一,它提供了強(qiáng)大的功能和簡(jiǎn)潔的 API,讓數(shù)據(jù)庫(kù)操作變得更加簡(jiǎn)單和易維護(hù)。本文將詳細(xì)介紹 GORM 的常見(jiàn)用法,包括數(shù)據(jù)庫(kù)連接、模型定義、CRUD、事務(wù)管理等方面,幫助大家快速上手使用 GORM 進(jìn)行 Web 后端開(kāi)發(fā)。

安裝

通過(guò)如下命令安裝 GORM:

$ go get -u gorm.io/gorm

你也許見(jiàn)過(guò)使用 go get -u github.com/jinzhu/gorm 命令來(lái)安裝 GORM,這個(gè)是老版本 v1,現(xiàn)已過(guò)時(shí),不建議使用。新版本 v2 已經(jīng)遷移至 github.com/go-gorm/gorm 倉(cāng)庫(kù)下。

快速開(kāi)始GORM使用

如下示例代碼帶你快速上手 GORM 的使用:

package main
import (
    "gorm.io/driver/sqlite"
    "gorm.io/gorm"
)
// Product 定義結(jié)構(gòu)體用來(lái)映射數(shù)據(jù)庫(kù)表
type Product struct {
    gorm.Model
    Code  string
    Price uint
}
func main() {
    // 建立數(shù)據(jù)庫(kù)連接
    db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
    if err != nil {
        panic("failed to connect database")
    }
    // 遷移表結(jié)構(gòu)
    db.AutoMigrate(&Product{})
    // 增加數(shù)據(jù)
    db.Create(&Product{Code: "D42", Price: 100})
    // 查找數(shù)據(jù)
    var product Product
    db.First(&product, 1)                 // find product with integer primary key
    db.First(&product, "code = ?", "D42") // find product with code D42
    // 更新數(shù)據(jù) - update product's price to 200
    db.Model(&product).Update("Price", 200)
    // 更新數(shù)據(jù) - update multiple fields
    db.Model(&product).Updates(Product{Price: 200, Code: "F42"}) // non-zero fields
    db.Model(&product).Updates(map[string]interface{}{"Price": 200, "Code": "F42"})
    // 刪除數(shù)據(jù) - delete product
    db.Delete(&product, 1)
}

提示:這里使用了 SQLite 數(shù)據(jù)庫(kù)驅(qū)動(dòng),需要通過(guò) go get -u gorm.io/driver/sqlite 命令安裝。

將以上代碼保存在 main.go 中并執(zhí)行。

$ go run main.go

執(zhí)行完成后,我們將在當(dāng)前目錄下得到 test.db SQLite 數(shù)據(jù)庫(kù)文件。

① 進(jìn)入 SQLite 命令行。

② 查看已存在的數(shù)據(jù)庫(kù)表。

③ 設(shè)置稍后查詢(xún)表數(shù)據(jù)時(shí)的輸出模式為按列左對(duì)齊。

④ 查詢(xún)表中存在的數(shù)據(jù)。

有過(guò)使用 ORM 框架經(jīng)驗(yàn)的同學(xué),以上代碼即使我不進(jìn)行講解也能看懂個(gè)大概。

這段示例代碼基本能夠概括 GORM 框架使用套路:

  • 定義結(jié)構(gòu)體映射表結(jié)構(gòu):Product 結(jié)構(gòu)體在 GORM 中稱(chēng)作「模型」,一個(gè)模型對(duì)應(yīng)一張數(shù)據(jù)庫(kù)表,一個(gè)結(jié)構(gòu)體實(shí)例對(duì)象對(duì)應(yīng)一條數(shù)據(jù)庫(kù)表記錄。
  • 連接數(shù)據(jù)庫(kù):GORM 使用 gorm.Open 方法與數(shù)據(jù)庫(kù)建立連接,連接建立好后,才能對(duì)數(shù)據(jù)庫(kù)進(jìn)行 CRUD 操作。
  • 自動(dòng)遷移表結(jié)構(gòu):調(diào)用 db.AutoMigrate 方法能夠自動(dòng)完成在數(shù)據(jù)庫(kù)中創(chuàng)建 Product 結(jié)構(gòu)體所映射的數(shù)據(jù)庫(kù)表,并且,當(dāng) Product 結(jié)構(gòu)體字段有變更,再次執(zhí)行遷移代碼,GORM 會(huì)自動(dòng)對(duì)表結(jié)構(gòu)進(jìn)行調(diào)整,非常方便。不過(guò),我不推薦在生產(chǎn)環(huán)境項(xiàng)目中使用此功能。因?yàn)閿?shù)據(jù)庫(kù)表操作都是高風(fēng)險(xiǎn)操作,一定要經(jīng)過(guò)多人 Review 并審核通過(guò),才能執(zhí)行操作。GORM 自動(dòng)遷移功能雖然理論上不會(huì)出現(xiàn)問(wèn)題,但線上操作謹(jǐn)慎為妙,個(gè)人認(rèn)為只有在小項(xiàng)目或數(shù)據(jù)不那么重要的項(xiàng)目中使用比較合適。
  • CRUD 操作:遷移好數(shù)據(jù)庫(kù)后,就有了數(shù)據(jù)庫(kù)表,可以進(jìn)行 CRUD 操作了。

更換第三方SQLite驅(qū)動(dòng)解決

最近在開(kāi)發(fā)一個(gè)程序時(shí)用到GORM來(lái)操作SQLite數(shù)據(jù)庫(kù),GORM默認(rèn)使用gorm.io/driver/sqlite這個(gè)庫(kù)作為SQLite驅(qū)動(dòng),該庫(kù)用CGO實(shí)現(xiàn),在使用過(guò)程中遇到一些問(wèn)題,最后更換第三方SQLite驅(qū)動(dòng)解決。

問(wèn)題

正是因?yàn)镚ORM官方SQLite驅(qū)動(dòng)使用CGO實(shí)現(xiàn),因此我在使用過(guò)程中遇到以下錯(cuò)誤:

[error] failed to initialize database, got error Binary was compiled with 'CGO_ENABLED=0', go-sqlite3 requires cgo to work. This is a stub panic: Binary was compiled with 'CGO_ENABLED=0', go-sqlite3 requires cgo to work. This is a stub

大致意思是GORM SQLite驅(qū)動(dòng)使用了CGO實(shí)現(xiàn),需要在CGO環(huán)境下才能工作。

那么解決方法也很簡(jiǎn)單,只需要修改CGO_ENABLED這個(gè)環(huán)境變量啟用CGO支持即可:

go env -w CGO_ENABLED=1

啟用CGO后,編譯的是動(dòng)態(tài)鏈庫(kù)的二進(jìn)制文件,那么你一旦更換平臺(tái),比如將程序放到Windows下運(yùn)行,可能因?yàn)槿鄙傧嚓P(guān)的一些動(dòng)態(tài)鏈庫(kù)(比如:SQLite)從而無(wú)法運(yùn)行,為了保持編譯的二進(jìn)制文件能夠無(wú)動(dòng)態(tài)依賴(lài)的情況下正常運(yùn)行,因此不得不考慮靜態(tài)編譯,所以就和GORM SQLite驅(qū)動(dòng)產(chǎn)生了沖突。

解決方案:更換GORM默認(rèn)的SQLite驅(qū)動(dòng)

在GORM官方的Issues發(fā)現(xiàn)也有人反饋此類(lèi)問(wèn)題,于是順藤摸瓜,找到了github.com/glebarez/sqlite這個(gè)庫(kù),該庫(kù)使用純go實(shí)現(xiàn),不依賴(lài)CGO,地址是:https://github.com/glebarez/sqlite

于是將官方的驅(qū)動(dòng):

import (
    "gorm.io/driver/sqlite"
    "gorm.io/gorm"
)

更換為:

import (
    "github.com/glebarez/sqlite"
    "gorm.io/gorm"
)

這樣就可以在不依賴(lài)CGO的情況下編譯出靜態(tài)二進(jìn)制文件,從而解決跨平臺(tái)依賴(lài)動(dòng)態(tài)鏈庫(kù)的問(wèn)題。

代價(jià)

  • glebarez/sqlite性能不及官方驅(qū)動(dòng),但犧牲少部分性能來(lái)?yè)Q取方便個(gè)人覺(jué)得還是值得的,如果沒(méi)有跨平臺(tái)需求,使用官方默認(rèn)驅(qū)動(dòng)即可
  • 靜態(tài)編譯打包后的文件體積明顯增加

以上就是更換GORM默認(rèn)SQLite驅(qū)動(dòng)出現(xiàn)的問(wèn)題解決分析的詳細(xì)內(nèi)容,更多關(guān)于更換GORM默認(rèn)SQLite驅(qū)動(dòng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Golang跳轉(zhuǎn)語(yǔ)句continue與goto使用語(yǔ)法詳解

    Golang跳轉(zhuǎn)語(yǔ)句continue與goto使用語(yǔ)法詳解

    這篇文章主要介紹了Golang跳轉(zhuǎn)語(yǔ)句continue與goto使用語(yǔ)法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2023-01-01
  • 淺析Go語(yǔ)言中的逃逸分析

    淺析Go語(yǔ)言中的逃逸分析

    在Go語(yǔ)言中,內(nèi)存分配和逃逸分析是至關(guān)重要的概念,對(duì)于理解代碼的性能和內(nèi)存使用情況至關(guān)重要,本文將深入探討Go語(yǔ)言中的內(nèi)存分配原理以及逃逸分析的作用,希望對(duì)大家有所幫助
    2024-04-04
  • 探索Go語(yǔ)言中的switch高級(jí)用法

    探索Go語(yǔ)言中的switch高級(jí)用法

    在Go語(yǔ)言中,switch語(yǔ)句除了常見(jiàn)的用法外,還有一種不常用但有趣的寫(xiě)法,這種寫(xiě)法中,switch后面不跟任何表達(dá)式,而每個(gè)case后面跟的是返回bool類(lèi)型的函數(shù)調(diào)用表達(dá)式,這實(shí)際上是一個(gè)等價(jià)于switch true的用法,通過(guò)從上到下逐一比較case后的表達(dá)式是否為true來(lái)決定執(zhí)行哪個(gè)分支
    2024-10-10
  • golang切片拷貝的實(shí)現(xiàn)

    golang切片拷貝的實(shí)現(xiàn)

    在Golang中,切片的淺拷貝只復(fù)制指向?qū)ο蟮闹羔?而深拷貝則復(fù)制數(shù)據(jù)本身,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-10-10
  • 一文掌握Golang的panic和recover實(shí)戰(zhàn)

    一文掌握Golang的panic和recover實(shí)戰(zhàn)

    Go語(yǔ)言中,異常處理通常依賴(lài)error返回值,本文將通過(guò)示例展示如何在Go語(yǔ)言中正確使用recover來(lái)處理panic異常,防止程序直接崩潰,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • Go語(yǔ)言使用組合的思想實(shí)現(xiàn)繼承

    Go語(yǔ)言使用組合的思想實(shí)現(xiàn)繼承

    這篇文章主要為大家詳細(xì)介紹了在 Go 里面如何使用組合的思想實(shí)現(xiàn)“繼承”,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定的幫助,需要的可以了解一下
    2022-12-12
  • Golang String字符串類(lèi)型轉(zhuǎn)Json格式

    Golang String字符串類(lèi)型轉(zhuǎn)Json格式

    本文主要介紹了Golang String字符串類(lèi)型轉(zhuǎn)Json格式的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • go語(yǔ)言語(yǔ)法基礎(chǔ)的全面梳理(適合入門(mén))

    go語(yǔ)言語(yǔ)法基礎(chǔ)的全面梳理(適合入門(mén))

    這篇文章主要介紹了go語(yǔ)言語(yǔ)法基礎(chǔ)的相關(guān)資料,從基礎(chǔ)語(yǔ)法到并發(fā)編程,涵蓋變量聲明、數(shù)據(jù)類(lèi)型、流程控制、函數(shù)、接口、錯(cuò)誤處理及并發(fā)編程,全面覆蓋Go語(yǔ)言核心特性,需要的朋友可以參考下
    2026-06-06
  • Go語(yǔ)言學(xué)習(xí)otns示例分析

    Go語(yǔ)言學(xué)習(xí)otns示例分析

    這篇文章主要為大家介紹了Go語(yǔ)言學(xué)習(xí)otns示例分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • 通過(guò)goland 進(jìn)行遠(yuǎn)程 dlv的實(shí)現(xiàn)過(guò)程

    通過(guò)goland 進(jìn)行遠(yuǎn)程 dlv的實(shí)現(xiàn)過(guò)程

    本文探討Kubernetes中通過(guò)Remote dlv調(diào)試解決容器因遠(yuǎn)程數(shù)據(jù)源異常導(dǎo)致的問(wèn)題難以復(fù)現(xiàn),采用Sidecar和直接集成方式,配置attach、--headless等參數(shù),并利用本地端口轉(zhuǎn)發(fā)實(shí)現(xiàn)調(diào)試連接,感興趣的朋友跟隨小編一起看看吧
    2025-09-09

最新評(píng)論

蕲春县| 常德市| 花垣县| 黎川县| 卢氏县| 赞皇县| 敦化市| 彩票| 柘城县| 喀喇沁旗| 册亨县| 孟州市| 同德县| 房产| 射阳县| 汝阳县| 汉源县| 汽车| 阳泉市| 松溪县| 增城市| 湘乡市| 恩平市| 京山县| 饶平县| 本溪| 孙吴县| 蛟河市| 磐石市| 图木舒克市| 皮山县| 阿合奇县| 绥滨县| 徐水县| 东海县| 澜沧| 黔东| 丘北县| 谢通门县| 沧州市| 翁源县|