gorm是一个使用Go语言编写的ORM框架。它文档齐全,对开发者友好,支持主流数据库。
1.GORM入门
1.1安装
go get -u github.com/jinzhu/gorm
1.2数据库驱动
连接不同的数据库都需要导入对应数据的驱动程序,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"
1.3连接MySQL
import ("github.com/jinzhu/gorm"_ "github.com/jinzhu/gorm/dialects/mysql")func main() {db, _ := gorm.Open("mysql", "root:123456@(localhost)/dbname?charset=utf8mb4&parseTime=True&loc=Local")defer db.Close()}
2.GORM操作MySQL
package mainimport ("fmt""github.com/jinzhu/gorm"_ "github.com/jinzhu/gorm/dialects/mysql")//User用户信息type User struct {ID uintName stringAge string}func main() {db, err := gorm.Open("mysql", "root:123456@(127.0.0.1:3306)/sql_test?charset=utf8mb4&parseTime=True&loc=Local")if err != nil {panic(err)}defer db.Close()db.AutoMigrate(&User{}) // 自动迁移u1 := User{ID: 1,Name: "cheng",Age: "18",}u2 := User{ID: 2,Name: "song",Age: "20",}// 创建记录db.Create(&u1)db.Create(&u2)//查询第一条记录user1 := new(User)db.First(user1)fmt.Println(*user1) //{1 cheng 18}//查询var user2 Userdb.Find(&user2,"name=?","cheng")fmt.Println(user2) //{1 cheng 18}//更新db.Model(&u1).Update("name","jiacheng")//删除db.Delete(&u2)}
3.GORM Model
在使用ORM工具时,通常我们需要在代码中定义模型(Models)与数据库中的数据表进行映射,在GORM中模型(Models)通常是正常定义的结构体、基本的go类型或它们的指针。 同时也支持sql.Scanner及driver.Valuer接口
type Model struct {ID uint `gorm:"primary:key"`CreateAt time.TimeUpdateAt time.TimeDeleteAt *time.Time}
你可以将它嵌入到你自己的模型中:
type User struct {gorm.ModelName string}
// 不使用gorm.Model// 自行定义模型type User struct {ID intName string}
3.1模型定义示例
type User struct {gorm.ModelName stringAge sql.NullInt64Birthday *time.TimeEmail string `gorm:"type:varchar(100);unique_index"`Role string `gorm:"size:255"` //设置字段大小为255MemberNumber *string `gorm:"unique,not null"` //唯一且不为空Num int `gorm:"ATUO_INCREMENT"` //设置num为自增类型Address string `gorm:"index:addr"` //给address字段创建名为addr的索引IgnoreMe int `gorm:"-"` //忽略本字段}
3.2结构体标记(tags)
| 结构体标记(Tag) | 描述 |
|---|---|
| Column | 指定列名 |
| Type | 指定列数据类型 |
| Size | 指定列大小, 默认值255 |
| PRIMARY_KEY | 将列指定为主键 |
| UNIQUE | 将列指定为唯一 |
| DEFAULT | 指定列默认值 |
| PRECISION | 指定列精度 |
| NOT NULL | 将列指定为非 NULL |
| AUTO_INCREMENT | 指定列是否为自增类型 |
| INDEX | 创建具有或不带名称的索引, 如果多个索引同名则创建复合索引 |
| UNIQUE_INDEX | 和 INDEX 类似,只不过创建的是唯一索引 |
| EMBEDDED | 将结构设置为嵌入 |
| EMBEDDED_PREFIX | 设置嵌入结构的前缀 |
| - | 忽略此字段 |
3.3关联相关标记(tags)
| 结构体标记(Tag) | 描述 |
|---|---|
| MANY2MANY | 指定连接表 |
| FOREIGNKEY | 设置外键 |
| ASSOCIATION_FOREIGNKEY | 设置关联外键 |
| POLYMORPHIC | 指定多态类型 |
| POLYMORPHIC_VALUE | 指定多态值 |
| JOINTABLE_FOREIGNKEY | 指定连接表的外键 |
| ASSOCIATION_JOINTABLE_FOREIGNKEY | 指定连接表的关联外键 |
| SAVE_ASSOCIATIONS | 是否自动完成 save 的相关操作 |
| ASSOCIATION_AUTOUPDATE | 是否自动完成 update 的相关操作 |
| ASSOCIATION_AUTOCREATE | 是否自动完成 create 的相关操作 |
| ASSOCIATION_SAVE_REFERENCE | 是否自动完成引用的 save 的相关操作 |
| PRELOAD | 是否自动完成预加载的相关操作 |
4.GORM约定
4.1主键(Primary Key)
type User struct {ID string // 名为`ID`的字段会默认作为表的主键Name string}
type Student struct {StudentID int64 `gorm:"primary_key"` //StudentID为主键Name string}
4.2表名(Table Name)
type User struct {} //默认表名是 `users`func (User) TableName() string {return "profiles"}
type User struct {ID uintName stringAge string} //默认表名是 `users`//func (User) TableName() string {// return "profiles"//}func main() {db, _ := gorm.Open("mysql", "root:123456@(127.0.0.1:3306)/sql_test?charset=utf8mb4&parseTime=True&loc=Local")// 禁用默认表名的复数形式,如果置为 true,则 `User` 的默认表名是 `user`db.SingularTable(true)db.AutoMigrate(&User{}) // 自动迁移}
db.Table("userInfo").CreateTable(&User{})
var UserInfo []Userdb.Table("userinfo").Find(&UserInfo) // SELECT * FROM userinfo;fmt.Println(UserInfo)
db.Table("userinfo").Delete(&UserInfo,"name=?","cheng")//DELETE FROM userinfo WHERE name = 'cheng';
4.3列名(Column Name)
type UserInfo struct {ID uintName stringBirthday time.TimeCreateAt time.Time}
type Person struct {ID int64 `gorm:"column:Person_id"`Birthday time.Time `gorm:"column:day"`Age int64 `gorm:"Column:age"`}
4.4时间戳跟踪
CreatedAt
模型有 CreatedAt字段,该字段的值将会是初次创建记录的时间。
type UserInfo struct {ID uintCreatedAt time.Time}func main() {db, _ := gorm.Open("mysql", "root:123456@(127.0.0.1:3306)/sql_test?charset=utf8mb4&parseTime=True&loc=Local")db.AutoMigrate(&UserInfo{}) // 自动迁移user := UserInfo{ID: 1,}db.Create(&user)}
db.Model(&user).Update("CreatedAt",time.Now())
UpdatedAt
模型有UpdatedAt字段,该字段的值将会是每次更新记录的时间。
type UserInfo struct {ID uintCreatedAt time.TimeUpdatedAt time.Time}func main() {db, _ := gorm.Open("mysql", "root:123456@(127.0.0.1:3306)/sql_test?charset=utf8mb4&parseTime=True&loc=Local")db.AutoMigrate(&UserInfo{}) // 自动迁移u1 := UserInfo{ID: 1,}u2 := UserInfo{ID: 2,}db.Create(&u1)db.Save(&u2) //`UpdatedAt`将会是当前时间}
db.Model(&user).Update("name", "jiacheng") // `UpdatedAt`将会是当前时间
DeletedAt
如果模型有DeletedAt字段,调用Delete删除该记录时,将会设置DeletedAt字段为当前时间,
而不是直接将记录从数据库中删除。
package mainimport ("github.com/jinzhu/gorm""time"_ "github.com/jinzhu/gorm/dialects/mysql")type UserInfo struct {ID uintCreatedAt time.TimeUpdatedAt time.TimeDeletedAt time.Time}func main() {db, _ := gorm.Open("mysql", "root:123456@(127.0.0.1:3306)/sql_test?charset=utf8mb4&parseTime=True&loc=Local")//db.AutoMigrate(&UserInfo{}) // 自动迁移db.Delete(&UserInfo{},"id=?","1")}
