什麽是ORM?
ORM優缺點
優點:
提高開發效率
缺點:
犧牲執行性能
犧牲靈活性
弱化SQL能力
gorm介紹
GORM官網學習文档
進入github.com,搜索golang orm,點擊jinzhu/gorm,然後點擊https://gorm.io官網:
把頁面語言改成簡體中文,查看Docs(即文档),學習gorm
安裝
go get -u github.com/jinzhu/grom
連接數據庫
連接不同的數據庫都需要導入對應數據的敺動程序,GORM已經包裝了一些敺動程序,只需要按如下方式導入需要的數據庫敺動即可:
import _ "github.com/jinzhu/gorm/dialects/mysql" // import _ "github.com/jinzhu/gorm/dialects/postgres" // import _ "github.com/jinzhu/gorm/dialects/sqlite" // import _ "github.com/jinzhu/gorm/dialects/mssql"
連接MySQL
import ( "github.com/jinzhu/gorm" _"github.com/jinzhu/gorm/dialects/mysql" ) func main(){ db, err := gorm.Open("myqul","user:password@(localhost)/dbname?charset=utf8mb4&parseTime=True&loc=Local") defer db.Close() }
連接PostgreSQL
基本上同上,注意引入對應postgres敺動並正確指定gorm.Open()參數。
import( "github.com/jinzhu/gorm" _"github.com/jinzhu/gorm/dialects/postgres" ) func main(){ db, err := gorm.Open("postgres","host=myhost port=myport user=gorm dbname=gorm password=mypassword") defer db.Close() }
連接Sqlite3(是一個文档數據庫)
基本代碼同上,注意引入對應sqlite敺動並正確指定gorm.Open()參數。
import( "github.com/jinzhu/gorm" _"github.com/jinzhu/gorm/dialects/sqlite" ) func mian(){ db, err := gorm.Open("sqlite3","/tmp/gorm.db") // 文档的路徑 defer db.Close() }
連接SQL Server
基本代碼同上,注意引入對應mssql敺動並正確指定grom.Open()參數。
import( "github.com/jinzhu/gorm" _"github.com/jinzhu/grom/dialects/mssql" ) func main(){ db, err := gorm.Open("mssql","sqlserver://username:password@localhost:1433?database=dbname") defer db.Close() }
GORM基本示例
注意:
1.本文以MySQL數據庫爲例,講解GORM各項功能的主要使用方法。
2.往下閲讀本文前,你需要有一個能夠成功連接上的MySQL數據庫實例。
Docker快速創建MySQL實例
如果不會安裝MySQL或者嬾得安裝,可以使用命令快速運行一個MySQL8.0.19實例,當然前提死要有docker環境。
在本地的13306耑口運行一個名爲mysql8019,root用戶名密碼爲root1234的MySQL容器環境:
docker run --name mysql8019 -p 13306:3306 -e MYSQL_ROOT_PASSWORD=root1234 -d mysql:8.0.19
在另外啓動一個MySQL Client連接上面的MySQL環境,密碼爲上一步指定的密碼root1234:
docker run -it --network host --rm mysql mysql -h127.0.0.1 -P13306 --default-character-set=utf8mb4-uroot -p
創建數據庫
在使用GORM前手動創建數據庫db1:
CREATE DATABASE db1;
GORM操作MySQL
使用GORM連接上面的db1進行創建、查詢、更新、刪除操作。
package main import ( "fmt" "github.com/jinzhu/gorm" _"github.com/jinzhu/gorm/dialects/mysql" ) // UserInfo用戶信息 type UserInfo struct { ID unit Name string Gender string Hobby string } func main(){ // 連接MySQL數據庫 db, err := gorm.Open("mysql","root:root1234@(127.0.0.1:3306)/db?charset=utf8mb4&parseTime=true&loc=Local") if err != nil { panic(err) } defer db.Close() // 創建表 自動遷移(把結構體和數據表進行對應) db.AutoMigrate(&UserInfo{}) // 創建數據行 u1 := UserInfo{1,"七米","男","籃球"} u2 := UserInfo{2,"沙河娜紥","女","足球"} // 創建記錄 db.Create(&u1) db.Create(&u2) // 查詢 var u = new(UserInfo) db.First(u) // 查詢表中第一條數據保存到u fmt.Printf("%#v\n",u) var uu UserInfo db.Find(&&uu,"hobby=?","足球") fmt.Printf("%#v\n",uu) // 更新 db.Model(&u).Update("hobby","雙色球") // 刪除 db.Delete(&u) }
GORM Model定義
在使用ORM工具時,通常我們需要在代碼中定義模型(Models)與數據庫中的數據表進行映射,在GORM中模型(Models)通常是正常定義的結構體、基本的go類型或它們的指針。同時也支持sql.Scanner及driver.Valuer接口(interface)。
gorm.Model
爲了方便模型定義,GORM内置了一個gorm.Model結構體。
Gorm.Model是一個包含了ID,CreateAt,UpdateAt,DeleteAt四個字段的Golang結構體。
// gorm.Model定義 type Model struct { ID unit `gorm:"primary_key"` CreateAt time.Time UpdateAt time.Time DeleteAt *time.Time }
你可以將它嵌入到你自己的模型中:
// 將`ID`,`CreateAt`,`UpdateAt`,`DeleteAt`字段注入到`User`模型中 type User struct { Gorm.Model Name string }
當然你也可以完全自己定義模型:
// 不使用gorm.Model,自行定義模型 type User struct { ID int Name string }
模型定義示例
type user struct { gorm.Model // 内嵌gorm.Model Name string Age sql.NullInt64 // 零值類型 Birthday *time.Time Email string `gorm:"type:varchar(100);unique_index"` Role string `gorm:"size:255"` // 設置字段大小爲255 MemberNumber *string `gorm:"unique;nor null"` // 設置會員(member number)唯一且不爲空 Num int `gorm:"AUTO_INCREMENT"` // 設置num爲自增類型 Address string `gorm:"index:addr"` // 給address字段創建名爲addr的索引 IgnoreMe int `gorm:"-"` // 忽略本字段 }