一、GORM
ORM:即Object-Relational Mapping,它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了。
GORM:gorm是go语言的一个orm框架,Golang 写的,开发人员友好的 ORM 库。
安装GORM:
go get github.com/jinzhu/gorm
新建test_gorm项目
D:\GO_workspace_web>md test_gorm
D:\GO_workspace_web>cd test_gorm
D:\GO_workspace_web\test_gorm>go mod init test_gorm
go: creating new go.mod: module test_gorm
D:\GO_workspace_web\test_gorm>
使用GoLand打开项目,进入Terminal命令
PS D:\GO_workspace_web\test_gorm> go get github.com/jinzhu/gorm
go: downloading github.com/jinzhu/gorm v1.9.16
go: downloading github.com/jinzhu/inflection v1.0.0
go: added github.com/jinzhu/gorm v1.9.16
go: added github.com/jinzhu/inflection v1.0.0
PS D:\GO_workspace_web\test_gorm>
1、GORM连接数据库
package main
import (
_ "github.com/go-sql-driver/mysql" //引入mysql的驱动
"github.com/jinzhu/gorm"
)
func main() {
//连接数据库:
//Open传入两个参数:
//第一个参数:指定你要连接的数据库
//第二个参数:指的是数据库的设置信息:用户名:密码@tcp(ip:port)/数据库名字?charset=utf8&parseTime=True&loc=Local
//charset=utf8设置字符集
//parseTime=True为了处理time.Time
//loc=Local 时区设置,与本地时区保持一致
db, err := gorm.Open("mysql", "root:root@tcp(localhost:3306)/testgorm?charset=utf8&parseTime=True&loc=Local")
if err != nil {
panic(err)
}
defer db.Close()
}
2、单表的增删改查
package main
import (
"fmt"
_ "github.com/go-sql-driver/mysql" //引入mysql的驱动
"github.com/jinzhu/gorm"
)
func main() {
db, err := gorm.Open("mysql", "root:root@tcp(localhost:3306)/testgorm?charset=utf8&parseTime=True&loc=Local")
if err != nil {
panic(err)
}
defer db.Close()
db.CreateTable(&User{}) //创建表,默认表名后加s
//db.Table("user").CreateTable(&User{}) //指定要创建的表名
//flg1 := db.HasTable(&User{}) //判断是否有某张表
//fmt.Println(flg1)
flg2 := db.HasTable("users") //判断是否有某张表
fmt.Println(flg2)
//db.DropTable(&User{}) //删除表
//db.DropTable("user") //指定删除表名
//增删改查
//增加
db.Create(&User{Name: "张无忌", Age: 30})
//查询
var muser User
db.First(&muser, "age=?", 30)
fmt.Println(muser)
//更新:先查询再更新
db.Model(&muser).Update("age", 40)
fmt.Println(muser)
db.Model(&muser).Update("name", "张翠山")
fmt.Println(muser)
//删除:先查询再删除
db.Delete(&muser)
fmt.Println(muser)
}
type User struct {
Name string
Age int
}
3、结构体名和表名的映射规则
- 如果结构体名没有驼峰命名,那么表名就是:结构体名小写+复数形式: 如结构体名User-->表名users
- 如果结构体名有驼峰命名,那么表名就是:大写变小写并在前面加下划线,最后加复数形式:如结构体名UserInfo-->表名user_infos
- 如有结构体名有连续的大写字母,那么表名就是:连续的大写字母变小写,驼峰前加下划线,字母变小写,最后加复数形式:如结构体名:DBUserInfo-->表名db_user_infos
- 结构体中字段名称与表中列名的映射规则同上
自定义表名
package main
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
type User struct {
Age int
Name string
}
type UserInfo struct {
Age int
Name string
}
type DBUserInfo struct {
Age int
Name string
}
type MyUser struct {
Age int
Name string
}
func (MyUser) TableName() string {//自定义表名
return "test_my_user"
}
func main() {
db, err := gorm.Open("mysql", "root:root@tcp(localhost:3306)/testgorm?charset=utf8&parseTime=True&loc=Local")
if err != nil {
panic(err)
}
defer db.Close()
db.CreateTable(&User{})
db.CreateTable(&UserInfo{})
db.CreateTable(&DBUserInfo{})
db.CreateTable(&MyUser{})
}
人必须要成长!
如今一道为尊,万道相和,几乎很难破。最可怕的是苍穹!