欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

更換GORM默認SQLite驅動出現的問題解決分析

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

GORM簡介

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

安裝

通過如下命令安裝 GORM:

$ go get -u gorm.io/gorm

你也許見過使用 go get -u github.com/jinzhu/gorm 命令來安裝 GORM,這個是老版本 v1,現已過時,不建議使用。新版本 v2 已經遷移至 github.com/go-gorm/gorm 倉庫下。

快速開始GORM使用

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

package main
import (
    "gorm.io/driver/sqlite"
    "gorm.io/gorm"
)
// Product 定義結構體用來映射數據庫表
type Product struct {
    gorm.Model
    Code  string
    Price uint
}
func main() {
    // 建立數據庫連接
    db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
    if err != nil {
        panic("failed to connect database")
    }
    // 遷移表結構
    db.AutoMigrate(&Product{})
    // 增加數據
    db.Create(&Product{Code: "D42", Price: 100})
    // 查找數據
    var product Product
    db.First(&product, 1)                 // find product with integer primary key
    db.First(&product, "code = ?", "D42") // find product with code D42
    // 更新數據 - update product's price to 200
    db.Model(&product).Update("Price", 200)
    // 更新數據 - 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"})
    // 刪除數據 - delete product
    db.Delete(&product, 1)
}

提示:這里使用了 SQLite 數據庫驅動,需要通過 go get -u gorm.io/driver/sqlite 命令安裝。

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

$ go run main.go

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

① 進入 SQLite 命令行。

② 查看已存在的數據庫表。

③ 設置稍后查詢表數據時的輸出模式為按列左對齊。

④ 查詢表中存在的數據。

有過使用 ORM 框架經驗的同學,以上代碼即使我不進行講解也能看懂個大概。

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

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

更換第三方SQLite驅動解決

最近在開發(fā)一個程序時用到GORM來操作SQLite數據庫,GORM默認使用gorm.io/driver/sqlite這個庫作為SQLite驅動,該庫用CGO實現,在使用過程中遇到一些問題,最后更換第三方SQLite驅動解決。

問題

正是因為GORM官方SQLite驅動使用CGO實現,因此我在使用過程中遇到以下錯誤:

[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驅動使用了CGO實現,需要在CGO環(huán)境下才能工作。

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

go env -w CGO_ENABLED=1

啟用CGO后,編譯的是動態(tài)鏈庫的二進制文件,那么你一旦更換平臺,比如將程序放到Windows下運行,可能因為缺少相關的一些動態(tài)鏈庫(比如:SQLite)從而無法運行,為了保持編譯的二進制文件能夠無動態(tài)依賴的情況下正常運行,因此不得不考慮靜態(tài)編譯,所以就和GORM SQLite驅動產生了沖突。

解決方案:更換GORM默認的SQLite驅動

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

于是將官方的驅動:

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

更換為:

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

這樣就可以在不依賴CGO的情況下編譯出靜態(tài)二進制文件,從而解決跨平臺依賴動態(tài)鏈庫的問題。

代價

  • glebarez/sqlite性能不及官方驅動,但犧牲少部分性能來換取方便個人覺得還是值得的,如果沒有跨平臺需求,使用官方默認驅動即可
  • 靜態(tài)編譯打包后的文件體積明顯增加

以上就是更換GORM默認SQLite驅動出現的問題解決分析的詳細內容,更多關于更換GORM默認SQLite驅動的資料請關注腳本之家其它相關文章!

相關文章

  • Golang中context包使用場景和示例詳解

    Golang中context包使用場景和示例詳解

    這篇文章結合示例代碼介紹了context包的幾種使用場景,文中有詳細的代碼示例,對學習或工作有一定的幫助,需要的朋友可以參考下
    2023-05-05
  • Go基礎教程系列之Go接口使用詳解

    Go基礎教程系列之Go接口使用詳解

    這篇文章主要介紹了Go基礎教程系列之Go接口使用詳解,需要的朋友可以參考下
    2022-04-04
  • go mod 依賴管理的具體使用

    go mod 依賴管理的具體使用

    在Go語言開發(fā)中,依賴管理是一項非常重要的工作,Go mod作為官方的包管理工具已經成為了Go語言依賴管理的首選方式,本文就來介紹一下go mod 依賴管理的具體使用,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • Go中Gzip與json搭配實現數據壓縮demo

    Go中Gzip與json搭配實現數據壓縮demo

    這篇文章主要為大家介紹了Go中Gzip與json搭配使用壓縮數據的實現demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • Golang文件讀寫操作詳情

    Golang文件讀寫操作詳情

    這篇文章主要介紹了Golang文件讀寫操作詳情,文件是數據源(保存數據的地方)的一種,文件最主要的作用就是保存數據,文件在程序中是以流的形式來操作的,更多詳細內容需要的朋友可以參考一下
    2022-07-07
  • GO語言操作Elasticsearch示例分享

    GO語言操作Elasticsearch示例分享

    這篇文章主要介紹了GO語言操作Elasticsearch示例分享的相關資料,需要的朋友可以參考下
    2023-01-01
  • 剖析Go編寫的Socket服務器模塊解耦及基礎模塊的設計

    剖析Go編寫的Socket服務器模塊解耦及基礎模塊的設計

    這篇文章主要介紹了Go的Socket服務器模塊解耦及日志和定時任務的模塊設計,舉了一些Go語言編寫的服務器模塊的例子,需要的朋友可以參考下
    2016-03-03
  • gtoken替換jwt實現sso登錄的問題小結

    gtoken替換jwt實現sso登錄的問題小結

    這篇文章主要介紹了gtoken替換jwt實現sso登錄,主要介紹了替換jwt的原因分析及gtoken的優(yōu)勢,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • Go語言范圍Range的具體使用

    Go語言范圍Range的具體使用

    range關鍵字在for循環(huán)中用于遍歷數組,切片,通道或映射的項目,本文主要介紹了Go語言范圍Range的具體使用,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • 使用Go語言生成二維碼并在命令行中輸出

    使用Go語言生成二維碼并在命令行中輸出

    二維碼(QR code)是一種矩陣條碼的標準,廣泛應用于商業(yè)、移動支付和數據存儲等領域,在開發(fā)過程中,我們可能需要在命令行中顯示二維碼,這可以幫助我們快速生成和分享二維碼信息,本文將介紹如何使用Go語言生成二維碼并在命令行中輸出,需要的朋友可以參考下
    2023-11-11

最新評論