什麽是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:"-"` // 忽略本字段
}