gorm初探
ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象与关系数据库相互映射
ORM让你的数据库里边的表结构变成你的代码定义的数据结构,从而做到:代码结构即为数据库结构,代码行为即为数据库行为
安装gorm
官方文档)
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite
go get -u gorm.io/driver/mysql // 安装mysql
连接mysql
- 连接方式一
// 解析DSN参数
// root:root 用户名:密码
// @tcp(127.0.0.1:8889) 数据库地址:端口号,我这里的端口号是8889,一般数据库默认端口号是3306
// /test_gin 你数据库的库名
// ?charset=utf8mb4 连接数据库的字符集
// &parseTime=True 想要正确的处理 time.Time ,您需要带上 parseTime 参数
dsn := "root:root@tcp(127.0.0.1:8889)/test_gin?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
fmt.Println("连接数据库失败:", err.Error())
}
- 连接方式二
db, err := gorm.Open(mysql.New(mysql.Config{
DSN: "root:root@tcp(127.0.0.1:8889)/test_gin?charset=utf8mb4&parseTime=True&loc=Local", // DSN data source name
DefaultStringSize: 256, // string 类型字段的默认长度
DisableDatetimePrecision: true, // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持
DontSupportRenameIndex: true, // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
DontSupportRenameColumn: true, // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列
SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置
}), &gorm.Config{
SkipDefaultTransaction: false, // 是否跳过默认事务
NamingStrategy: schema.NamingStrategy{ // 设置表名相关配置
TablePrefix: "", // 标签缀
SingularTable: true, // 如果为true的话,表默认创建为单数,比如user
},
DisableForeignKeyConstraintWhenMigrating: true, // 是否跳过外键约束,建议设置为true
})
if err != nil {
fmt.Println("连接数据库失败:", err.Error())
}
fmt.Println(db)
创建一个表
type User struct {
Name string
}
_ = db.AutoMigrate(&User{})
// 方法二
m := db.Migrator()
m.CreateTable(&User{}) // 如果表存在会报错
m.HasTable(&User{}) // 判断是否已经存在某个表了
m.HasTable("user") // 以表明的方式去判读是否已经存在了
m.DropTable(&User{}) // 删除一个表
m.DropTable("user") // 同样也支持使用表名的形式
m.RenameTable(&User{}, "user_rename") // 给表重命名
type Yingxiaozhu struct {
Name string
}
m.RenameTable(&User{}, &Yingxiaozhu{})
// 字段操作
m.AddColumn(&User{}, "Age") // 新增字段,注意新增的这个字段一定要在结构体中被定义
m.RenameColumn(&User{}, "Name", "ReName") // 重命名字段
fmt.Println(m.HasColumn(&User{}, "Name")) // 查看字段是否存在
// 创建一个表
if m.HasTable(&User{}) {
fmt.Println("user表已经存在,无需重复创建")
} else {
m.CreateTable(&User{})
fmt.Println("表创建成功")
}
连接池
sqlDb, _ := db.DB()
sqlDb.SetMaxIdleConns(10) // 连接池中空闲连接的最大数量
sqlDb.SetMaxOpenConns(100) // 连接池中最多可以有多少连接数量
sqlDb.SetConnMaxLifetime(time.Hour) // 设置连接池可服用的最大时间