首页 Golang,gorm

Gorm初探


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) // 设置连接池可服用的最大时间



文章评论

目录