更換GORM默認SQLite驅動出現(xiàn)的問題解決分析
GORM簡介
GORM 是 Go 語言中最受歡迎的 ORM 庫之一,它提供了強大的功能和簡潔的 API,讓數(shù)據(jù)庫操作變得更加簡單和易維護。本文將詳細介紹 GORM 的常見用法,包括數(shù)據(jù)庫連接、模型定義、CRUD、事務管理等方面,幫助大家快速上手使用 GORM 進行 Web 后端開發(fā)。
安裝
通過如下命令安裝 GORM:
$ go get -u gorm.io/gorm
你也許見過使用 go get -u github.com/jinzhu/gorm 命令來安裝 GORM,這個是老版本 v1,現(xiàn)已過時,不建議使用。新版本 v2 已經遷移至 github.com/go-gorm/gorm 倉庫下。
快速開始GORM使用
如下示例代碼帶你快速上手 GORM 的使用:
package main
import (
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
// Product 定義結構體用來映射數(shù)據(jù)庫表
type Product struct {
gorm.Model
Code string
Price uint
}
func main() {
// 建立數(shù)據(jù)庫連接
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
// 遷移表結構
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ù)庫驅動,需要通過 go get -u gorm.io/driver/sqlite 命令安裝。
將以上代碼保存在 main.go 中并執(zhí)行。
$ go run main.go
執(zhí)行完成后,我們將在當前目錄下得到 test.db SQLite 數(shù)據(jù)庫文件。

① 進入 SQLite 命令行。
② 查看已存在的數(shù)據(jù)庫表。
③ 設置稍后查詢表數(shù)據(jù)時的輸出模式為按列左對齊。
④ 查詢表中存在的數(shù)據(jù)。
有過使用 ORM 框架經驗的同學,以上代碼即使我不進行講解也能看懂個大概。
這段示例代碼基本能夠概括 GORM 框架使用套路:
- 定義結構體映射表結構:
Product結構體在 GORM 中稱作「模型」,一個模型對應一張數(shù)據(jù)庫表,一個結構體實例對象對應一條數(shù)據(jù)庫表記錄。 - 連接數(shù)據(jù)庫:GORM 使用
gorm.Open方法與數(shù)據(jù)庫建立連接,連接建立好后,才能對數(shù)據(jù)庫進行 CRUD 操作。 - 自動遷移表結構:調用
db.AutoMigrate方法能夠自動完成在數(shù)據(jù)庫中創(chuàng)建Product結構體所映射的數(shù)據(jù)庫表,并且,當Product結構體字段有變更,再次執(zhí)行遷移代碼,GORM 會自動對表結構進行調整,非常方便。不過,我不推薦在生產環(huán)境項目中使用此功能。因為數(shù)據(jù)庫表操作都是高風險操作,一定要經過多人 Review 并審核通過,才能執(zhí)行操作。GORM 自動遷移功能雖然理論上不會出現(xiàn)問題,但線上操作謹慎為妙,個人認為只有在小項目或數(shù)據(jù)不那么重要的項目中使用比較合適。 - CRUD 操作:遷移好數(shù)據(jù)庫后,就有了數(shù)據(jù)庫表,可以進行 CRUD 操作了。
更換第三方SQLite驅動解決
最近在開發(fā)一個程序時用到GORM來操作SQLite數(shù)據(jù)庫,GORM默認使用gorm.io/driver/sqlite這個庫作為SQLite驅動,該庫用CGO實現(xiàn),在使用過程中遇到一些問題,最后更換第三方SQLite驅動解決。

問題
正是因為GORM官方SQLite驅動使用CGO實現(xiàn),因此我在使用過程中遇到以下錯誤:
[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實現(xiàn),需要在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ā)現(xiàn)也有人反饋此類問題,于是順藤摸瓜,找到了github.com/glebarez/sqlite這個庫,該庫使用純go實現(xiàn),不依賴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驅動出現(xiàn)的問題解決分析的詳細內容,更多關于更換GORM默認SQLite驅動的資料請關注腳本之家其它相關文章!
相關文章
一文掌握Golang的panic和recover實戰(zhàn)
Go語言中,異常處理通常依賴error返回值,本文將通過示例展示如何在Go語言中正確使用recover來處理panic異常,防止程序直接崩潰,感興趣的朋友跟隨小編一起看看吧2024-09-09

