Go?使用xorm操作mysql詳情
xorm
官方介紹:xorm 是一個簡單而強大的 Go 語言 ORM 庫。
通過它可以使數(shù)據庫操作非常簡便。
xorm 的目標并不是讓你完全不去學習 SQL,我們認為 SQL 并不會為 ORM 所替代,但是 ORM 將可以解決絕大部分的簡單 SQL 需求。
xorm 支持兩種風格的混用。
xorm 還提供了工具,通過 reverse 命令根據數(shù)據庫的表結構生成對應的 struct,省去了人工組織代碼的工作,十分方便。官方地址:https://xorm.io/
安裝
瀏覽 xorm 的 github 地址,我們要下載 2 個包,https://github.com/go-xorm
1、xorm 驅動包,我們使用 xorm 的核心包 2、cmd 工具包,用于使用 reverse 命令生成數(shù)據表對應的 struct
通過 go get 命令分別下載 2 個包go get github.com/go-xorm/xorm``go get github.com/go-xorm/cmd/xorm
下載完成后 github.com 文件夾下會出現(xiàn) go-xorm 包
生成數(shù)據結構 struct
本地數(shù)據庫 test 有 2 張數(shù)據表,doctor_tb 和 user_tb, 數(shù)據結構如下:
我們現(xiàn)在就來生成這 2 張數(shù)據表的結構模型。
1、在任意項目下新建一個文件夾 xorm_models,文件名沒有規(guī)定,為了存放生成的代碼文件。
2、拷貝 cmd 工具包中的摸板目錄到 xorm_models 下,在文件目錄github.com\go-xorm\cmd\xorm\templates\goxorm
下
config
是生成的配置信息,struct.go.tpl
是數(shù)據摸板,允許自定義,可以根據自己的項目需求,修改摸板。一般不需要修改。
我們能看到生成了和表名同名的 2 個數(shù)據結構文件 doctor_tb.go 和 user_tb.go
package models ? import ( ? ? ? "time" ? ) ? type DoctorTb struct { ? ? ? Id ? ? ?int ? ? ? `xorm:"not null pk autoincr INT(11)"` ? ? ? Name ? ?string ? ?`xorm:"default '' comment('姓名') VARCHAR(50)"` ? ? ? Age ? ? int ? ? ? `xorm:"default 0 comment('年齡') INT(11)"` ? ? ? Sex ? ? int ? ? ? `xorm:"default 0 comment('性別') INT(11)"` ? ? ? Addtime time.Time `xorm:"DATETIME"` ? } ?
使用 xorm
xorm 支持鏈式的寫法
engine.Where("age > ?", 40).Or("name like ?", "林%").OrderBy("Id desc").Find(&docList2)
也支持直接執(zhí)行 sql 語句engine.SQL("select * from doctor_tb where age > ?", 40).Find(&docList4)
附上增刪改查事務的 demo 例子,代碼里都有注釋,很容易看懂。xorm 的封裝比較友好,只要熟悉 sql 語句,即便不看文檔,也能順利的使用各種關鍵字。
package main ? import ( ? ? ? "fmt" ? ? ? _ "github.com/go-sql-driver/mysql" ? ? ? "github.com/go-xorm/xorm" ? ? ? "goShare/xorm_models/models" ? ? ? "time" ? ) ? func main() { ? ? ? var engine *xorm.Engine ? ? ? //連接數(shù)據庫 ? ? ? engine, err := xorm.NewEngine("mysql", "root:112233@tcp(127.0.0.1:3305)/test?charset=utf8") ? ? ? if err != nil { ? ? ? ? ? fmt.Println(err) ? ? ? ? ? return ? ? ? } ? ? ? //連接測試 ? ? ? if err := engine.Ping(); err != nil { ? ? ? ? ? fmt.Println(err) ? ? ? ? ? return ? ? ? } ? ? ? defer engine.Close() //延遲關閉數(shù)據庫 ? ? ? fmt.Println("數(shù)據庫鏈接成功") ? ? ? //查詢單條數(shù)據 ? ? ? var doc models.DoctorTb ? ? ? b, _ := engine.Where("name = ?", "鐘南山").Get(&doc) ? ? ? if b { ? ? ? ? ? fmt.Println(doc) ? ? ? } else { ? ? ? ? ? fmt.Println("數(shù)據不存在") ? ? ? } ? ? ? //查詢單條數(shù)據方式 2 會根據結構體的 ? ? ? doc2 := models.DoctorTb{Name: "鐘南山"} ? ? ? b, _ = engine.Get(&doc2) ? ? ? fmt.Println(doc2) ? ? ? //新增數(shù)據 ? ? ? doc3 := models.DoctorTb{0, "王醫(yī)生", 48, 1, time.Now()} ? ? ? i3, _ := engine.InsertOne(doc3) ? ? ? fmt.Println("新增結果:", i3) ? ? ? //查詢列表 ? ? ? docList := make([]models.DoctorTb, 0) ? ? ? engine.Where("age > ? or name like ?", 40, "林%").Find(&docList) ? ? ? fmt.Println("docList:", docList) ? ? ? //查詢列表方式 2 ? ? ? docList2 := make([]models.DoctorTb, 0) ? ? ? engine.Where("age > ?", 40).Or("name like ?", "林%").OrderBy("Id desc").Find(&docList2) ? ? ? fmt.Println("docList2:", docList2) ? ? ? //查詢分頁 ? ? ? docList3 := make([]models.DoctorTb, 0) ? ? ? page := 0 ? ? //頁索引 ? ? ? pageSize := 2 //每頁數(shù)據 ? ? ? limit := pageSize ? ? ? start := page * pageSize ? ? ? totalCount, err := engine.Where("age > ? or name like ?", 40, "林%").Limit(limit, start).FindAndCount(&docList3) ? ? ? fmt.Println("總記錄數(shù):", totalCount, "docList3:", docList3) ? ? ? //直接用語句查詢 ? ? ? docList4 := make([]models.DoctorTb, 0) ? ? ? engine.SQL("select * from doctor_tb where age > ?", 40).Find(&docList4) ? ? ? fmt.Println("docList4:", docList4) ? ? ? //刪除 ? ? ? docDel := models.DoctorTb{Name: "王醫(yī)生"} ? ? ? iDel, _ := engine.Delete(&docDel) ? ? ? fmt.Println("刪除結果:", iDel) ? ? ? //刪除方式 2 ? ? ? engine.Exec("delete from doctor_tb where Id = ?", 3) ? ? ? //更新數(shù)據 ? ? ? doc5 := models.DoctorTb{Name: "鐘醫(yī)生"} ? ? ? //更新數(shù)據 ID 為 2 的記錄名字更改為“鐘醫(yī)生” ? ? ? iUpdate, _ := engine.Id(2).Update(&doc5) ? ? ? fmt.Println("更新結果:", iUpdate) ? ? ? //指定表名查詢。Table() ? ? ? user := models.UserTb{Id: 2} ? ? ? b, _ = engine.Table("user_tb").Get(&user) ? ? ? fmt.Println(user) ? ? ? //事務 ? ? ? session := engine.NewSession() ? ? ? defer session.Close() ? ? ? err = session.Begin() ? ? ? _, err = session.Exec("delete from doctor_tb where Id = ?", 6) ? ? ? if err != nil { ? ? ? ? ? session.Rollback() ? ? ? ? ? return ? ? ? } ? ? ? _, err = session.Exec("delete from user_tb where Id = ?", 10) ? ? ? if err != nil { ? ? ? ? ? session.Rollback() ? ? ? ? ? return ? ? ? } ? ? ? err = session.Commit() ? ? ? if err != nil { ? ? ? ? ? return ? ? ? } ? ? ? fmt.Println("事務執(zhí)行成功") ? } ?
總結:
歸納下使用流程 1、下載 xorm 包和 cmd 工具包 2、復制 cmd 工具包里的模板代碼文件夾至生成目錄底下 3、使用 reverse 生成數(shù)據結構代碼,省去苦力活 4、實例引擎
xorm.NewEngine()
5、痛快的調用
demo 里提供了我們開發(fā)業(yè)務上常用的增,刪,改,查單條數(shù)據,查列表,查分頁,事務等內容。
到此這篇關于Go 使用xorm操作mysql詳情的文章就介紹到這了,更多相關Go 使用xorm操作mysql內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Windows+Linux系統(tǒng)下Go語言環(huán)境安裝配置過程
Go 語言被設計成一門應用于搭載 Web 服務器,存儲集群或類似用途的巨型中央服務器的系統(tǒng)編程語言。這篇文章主要介紹了Windows+Linux系統(tǒng)下Go語言環(huán)境搭建配置過程,針對每種系統(tǒng)給大家講解的非常詳細,需要的朋友可以參考下2021-06-06