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) // 设置连接池可服用的最大时间
新车新盘 嘎嘎稳 嘎嘎靠谱coinsrore.com
新车首发,新的一年,只带想赚米的人coinsrore.com
新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com
新车上路,只带前10个人coinsrore.com
新盘首开 新盘首开 征召客户!!!coinsrore.com
新项目准备上线,寻找志同道合 的合作伙伴coinsrore.com
新车即将上线 真正的项目,期待你的参与coinsrore.com
新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!coinsrore.com
新车新盘 嘎嘎稳 嘎嘎靠谱coinsrore.com
新车首发,新的一年,只带想赚米的人coinsrore.com
新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com
新车上路,只带前10个人coinsrore.com
新盘首开 新盘首开 征召客户!!!coinsrore.com
新项目准备上线,寻找志同道合 的合作伙伴coinsrore.com
新车即将上线 真正的项目,期待你的参与coinsrore.com
新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!coinsrore.com
新车新盘 嘎嘎稳 嘎嘎靠谱coinsrore.com
新车首发,新的一年,只带想赚米的人coinsrore.com
新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com
新车上路,只带前10个人coinsrore.com
新盘首开 新盘首开 征召客户!!!coinsrore.com
新项目准备上线,寻找志同道合 的合作伙伴coinsrore.com
新车即将上线 真正的项目,期待你的参与coinsrore.com
新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!coinsrore.com
新车新盘 嘎嘎稳 嘎嘎靠谱coinsrore.com
新车首发,新的一年,只带想赚米的人coinsrore.com
新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com
新车上路,只带前10个人coinsrore.com
新盘首开 新盘首开 征召客户!!!coinsrore.com
新项目准备上线,寻找志同道合 的合作伙伴coinsrore.com
新车即将上线 真正的项目,期待你的参与coinsrore.com
新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!coinsrore.com
新车新盘 嘎嘎稳 嘎嘎靠谱coinsrore.com
新车首发,新的一年,只带想赚米的人coinsrore.com
新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com
新车上路,只带前10个人coinsrore.com
新盘首开 新盘首开 征召客户!!!coinsrore.com
新项目准备上线,寻找志同道合 的合作伙伴coinsrore.com
新车即将上线 真正的项目,期待你的参与coinsrore.com
新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!coinsrore.com