golang gorm 操作mysql及gorm基本用法
golang 官方的那個(gè)操作mysql的有點(diǎn)麻煩所以就使用了gorm,下面就gorm的使用做下簡(jiǎn)單介紹
下載gorm:
go get -u github.com/jinzhu/gorm
在項(xiàng)目中引入gorm:
import ( "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" )
定義db連接信息
func DbConn(MyUser, Password, Host, Db string, Port int) *gorm.DB { connArgs := fmt.Sprintf("%s:%s@(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", MyUser,Password, Host, Port, Db ) db, err := gorm.Open("mysql", connArgs) if err != nil { log.Fatal(err) } db.SingularTable(true) return db }
由于grom是使用的orm映射,所以需要定義要操作的表的model,在go中需要定義一個(gè)struct, struct的名字就是對(duì)應(yīng)數(shù)據(jù)庫(kù)中的表名,注意gorm查找struct名對(duì)應(yīng)數(shù)據(jù)庫(kù)中的表名的時(shí)候會(huì)默認(rèn)把你的struct中的大寫字母轉(zhuǎn)換為小寫并加上“s”,所以可以加上 db.SingularTable(true) 讓grom轉(zhuǎn)義struct名字的時(shí)候不用加上s。我是提前在數(shù)據(jù)庫(kù)中創(chuàng)建好表的然后再用grom去查詢的,也可以用gorm去創(chuàng)建表,我感覺(jué)還是直接在數(shù)據(jù)庫(kù)上創(chuàng)建,修改表字段的操作方便,grom只用來(lái)查詢和更新數(shù)據(jù)。
假設(shè)數(shù)據(jù)庫(kù)中的表已經(jīng)創(chuàng)建好,下面是數(shù)據(jù)庫(kù)中的建表語(yǔ)句:
CREATE TABLE `xz_auto_server_conf` ( `id` int(11) NOT NULL AUTO_INCREMENT, `group_zone` varchar(32) NOT NULL COMMENT '大區(qū)例如:wanba,changan,aiweiyou,360', `server_id` int(11) DEFAULT '0' COMMENT '區(qū)服id', `server_name` varchar(255) NOT NULL COMMENT '區(qū)服名稱', `open_time` varchar(64) DEFAULT NULL COMMENT '開(kāi)服時(shí)間', `service` varchar(30) DEFAULT NULL COMMENT '環(huán)境,test測(cè)試服,formal混服,wb玩吧', `username` varchar(100) DEFAULT NULL COMMENT 'data管理員名稱', `submit_date` datetime DEFAULT NULL COMMENT '記錄提交時(shí)間', `status` tinyint(2) DEFAULT '0' COMMENT '狀態(tài),0未處理,1已處理,默認(rèn)為0', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
定義model,即struct, 定于struct時(shí)我們可以只定義我們需要從數(shù)據(jù)庫(kù)中取回的特定字段:
gorm在轉(zhuǎn)義表名的時(shí)候會(huì)把stuct的大寫字母(首字母除外) 替換成“_”,所以下面的"XzAutoServerConf "會(huì)轉(zhuǎn)義成數(shù)數(shù)據(jù)庫(kù)中對(duì)應(yīng)“xz_auto_server conf”的表名, 對(duì)應(yīng)的字段名的查找會(huì)先按照tag里面的名稱去里面查找,如果沒(méi)有定義標(biāo)簽則按照struct定義的字段查找,查找的時(shí)候struct字段中的大寫會(huì)被轉(zhuǎn)義成“ ”,例“GroupZone”會(huì)去查找表中的group_zone字段
//定義struct type XzAutoServerConf struct { GroupZone string `gorm:"column:group_zone"` ServerId int OpenTime string ServerName string Status int }
//定義數(shù)據(jù)庫(kù)連接 type ConnInfo struct { MyUser string Password string Host string Port int Db string } func main () { cn := ConnInfo{ "root", 123456", "127.0.0.1", 3306, "xd_data", } db := DbConn(cn.MyUser,cn.Password,cn.Host,cn.Db,cn.Port) defer db.Close() // 關(guān)閉數(shù)據(jù)庫(kù)鏈接,defer會(huì)在函數(shù)結(jié)束時(shí)關(guān)閉數(shù)據(jù)庫(kù)連接 var rows []api.XzAutoServerConf //select db.Where("status=?", 0).Select([]string{"group_zone", "server_id", "open_time", "server_name"}).Find(&rows) //update err := db.Model(&rows).Where("server_id=?", 80).Update("status", 1).Error if err !=nil { fmt.Println(err) } fmt.Println(rows) }
更多grom操作可以參考: https://jasperxu.github.io/gorm-zh/
下面看下Golang GORM使用
gorm
gorm是go語(yǔ)言中實(shí)現(xiàn)數(shù)據(jù)庫(kù)訪問(wèn)的ORM(對(duì)象關(guān)系映射)庫(kù)。使用這個(gè)庫(kù),我們可以利用面向?qū)ο蟮姆椒?,更加方便的?duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行CRUD(增刪改查)。
基本使用
下載依賴
go get github.com/jinzhu/gorm go get github.com/go-sql-driver/mysql
第一個(gè)是核心庫(kù)。
第二個(gè)是mysql驅(qū)動(dòng)包。
連接數(shù)據(jù)庫(kù)
packae main import ( "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" "fmt" ) func main() { db, err := gorm.Open("mysql", "root:root@/test?charset=utf8&parseTime=True&loc=Local") if err != nil { fmt.Println(err) return }else { fmt.Println("connection succedssed") } defer db.Close()
新增數(shù)據(jù)
type User struct { ID int `gorm:"primary_key"` Name string `gorm:"not_null"` } func add() { user := &User{Name:"zhangsan"} db.Create(user) }
刪除數(shù)據(jù)
user := &User{ID:1} db.delete(user)
更新數(shù)據(jù)
user := &User{ID:1} db.Model(user).update("Name","lisi")
查詢數(shù)據(jù)
// query all var users []User db.Find(&users) fmt.Println(users) // query one user := new (User) db.First(user,1) fmt.Println(user)
其它
判斷數(shù)據(jù)庫(kù)中是否有結(jié)構(gòu)體對(duì)應(yīng)的表:
db.HasTable(User{})
創(chuàng)建表
db.CreateTable(User{})
以上就是gorm基本的用法。
總結(jié)
以上所述是小編給大家介紹的golang gorm 操作mysql及gorm基本用法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Go語(yǔ)言中實(shí)現(xiàn)enum枚舉的方法詳解
枚舉,即?enum,可用于表示一組范圍固定的值,它能助我們寫出清晰、安全的代碼,那么你是否了解過(guò)?Go?中的枚舉呢?下面就跟隨小編一起來(lái)學(xué)習(xí)一下Go語(yǔ)言中實(shí)現(xiàn)enum枚舉的常用方法吧2024-02-02解決panic: assignment to entry in nil
這篇文章主要介紹了解決panic: assignment to entry in nil map問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2008-01-01Golang 錯(cuò)誤捕獲Panic與Recover的使用
對(duì)于Go語(yǔ)言的錯(cuò)誤是通過(guò)返回值的方式,本文主要介紹了Golang 錯(cuò)誤捕獲Panic與Recover的使用,文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Go語(yǔ)言入門學(xué)習(xí)之Channel通道詳解
go routine可以使用channel來(lái)進(jìn)行通信,使用通信的手段來(lái)共享內(nèi)存,下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言入門學(xué)習(xí)之Channel通道的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07Go語(yǔ)言實(shí)現(xiàn)單端口轉(zhuǎn)發(fā)到多個(gè)端口
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言實(shí)現(xiàn)單端口轉(zhuǎn)發(fā)到多個(gè)端口,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的小伙伴可以了解下2024-02-02Go語(yǔ)言開(kāi)發(fā)技巧必知的小細(xì)節(jié)提升效率
這篇文章主要介紹了Go語(yǔ)言開(kāi)發(fā)技巧必知的小細(xì)節(jié)提升效率,分享幾個(gè)你可能不知道的Go語(yǔ)言小細(xì)節(jié),希望能幫助大家更好地學(xué)習(xí)這門語(yǔ)言2024-01-01Go1.18新特性使用Generics泛型進(jìn)行流式處理
這篇文章主要為大家介紹了Go1.18新特性使用Generics泛型進(jìn)行流式處理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06一文帶你熟悉Go語(yǔ)言中的分支結(jié)構(gòu)
這篇文章主要和大家分享一下Go語(yǔ)言中的分支結(jié)構(gòu)(if?-?else-if?-?else、switch),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定的幫助,需要的可以參考一下2022-11-11