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