gorm快速入门

构建结构何体,跟表结构进行对应

type Login struct {
    Username string
    Password string
}

指定结构体对应的表名是什么

func (Login) TableName() string {
    return "login"
}

快速开始

func GormQuickStart() {
    //连接数据库
    host := "localhost"
    port := 3306
    dbname := "test"
    user := "tester"
    pass := "123456"
    // data source name
    dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", user, pass, host, port, dbname)
    db, err := gorm.Open(mysql.Open(dsn), nil)
    if err != nil {
        panic(err)
    }

    // 所谓"orm"即不需要关心sql语句,把注意力集中到结构体上面来
    // 写入
    instance1 := Login{Username: "dqq", Password: "123456"}
    db.Create(&instance1)

    // 查询
    var instance2 Login
    db.Find(&instance2)
    fmt.Printf("%#v\n", instance2)
}

模型映射

// gorm.Model的定义。
// 默认情况下,GORM使用ID作为主键,使用结构体名的蛇形复数作为表名,字段名的蛇形作为列名。
// 不建议使用Migrator(迁移)功能,表的维护由DBA负责,而不是开发人员。
type User struct {
    // ID         int       //名为ID的字段为默认主键
    Id        int       `gorm:"primaryKey;column:id"` //显式指定主键,显式指定表里对应的列名
    UserId    int       `gorm:"column:uid"`           //显式指定列名
    Degree    string    //驼峰转为蛇形就是对应的列名
    Keywords  []string  `gorm:"json"`               //转为json,可以对应DB里的char、varchar或text
    CreatedAt time.Time `gorm:"column:create_time"` //在Create时GORM会自动把当前时间赋给CreatedAt
    UpdatedAt time.Time `gorm:"column:update_time"` //在Update时GORM会自动把当前时间赋给UpdatedAt
    //通过`gorm:"type:date"`可以显式指定对应的不是datetime,而是date
    Gender   string
    City     string
    Province string `gorm:"-"` //表里没有这一列(比如表里没有这个字段,但结构体需要有它)
}

//显式指定表名
func (User) TableName() string {
     return "user"
}

日志和连接池的相关配置

    //mb4兼容emoji表情符号。
    // 想要正确的处理time.Time ,您需要带上parseTime参数。
    // loc=Local采用机器本地的时区。
    DataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", user, pass, host, port, dbname)

日志控制

    //日志控制
    logFile, _ := os.OpenFile("D:/go_project/go_frame/log/gorm.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, os.ModePerm)
    newLogger := logger.New(
        log.New(logFile, "\r\n", log.LstdFlags), // io writer,可以输出到文件,也可以输出到os.Stdout
        logger.Config{
            SlowThreshold:             500 * time.Millisecond, //耗时超过此值认定为慢查询
            LogLevel:                  logger.Info,            // LogLevel的最低阈值,Silent为不输出日志
            IgnoreRecordNotFoundError: true,                   // 忽略RecordNotFound这种错误日志
            ParameterizedQueries:      false,                  // true代表SQL日志里不包含参数
            Colorful:                  false,                  // 禁用颜色
        },
    )

创建连接

    db, err := gorm.Open(mysql.Open(DataSourceName), &gorm.Config{
        PrepareStmt:            true, //执行任何SQL时都会创建一个prepared statement并将其缓存,以提高后续的效率
        SkipDefaultTransaction: true, // 为了确保数据一致性,GORM 会在事务里执行写入操作(创建、更新、删除)。如果没有这方面的要求,您可以在初始化时禁用它,这将获得大约 30%+ 性能提升。
        NamingStrategy: schema.NamingStrategy{ //覆盖默认的NamingStrategy来更改命名约定
            // TablePrefix:   "t_",                              // table name prefix, table for `User` would be `t_users`
            SingularTable: true, //表名映射时不加复数,仅是驼峰-->蛇形
            // NoLowerCase:   true,                              // skip the snake_casing of names
            // NameReplacer:  strings.NewReplacer("CID", "Cid"), // use name replacer to change struct/field name before convert it to db name
        },
        Logger:                   newLogger, //日志控制
        DryRun:                   false,     //true代表生成SQL但不执行,可以用于准备或测试生成的 SQL
        DisableNestedTransaction: true,      //在一个事务中使用Transaction方法,GORM会使用 SavePoint(savedPointName),RollbackTo(savedPointName) 为你提供嵌套事务支持。如果不需要嵌套事务,可以将其禁用
        DisableAutomaticPing:     false,     //在完成初始化后,GORM 会自动ping数据库以检查数据库的可用性
    })
    if err != nil {
        panic(err)
    }

连接池设置

    //连接池控制参数
    sqlDB, _ := db.DB()
    //池子里空闲连接的数量上限(超出此上限就把相应的连接关闭掉)
    sqlDB.SetMaxIdleConns(10)
    //最多开这么多连接
    sqlDB.SetMaxOpenConns(100)
    //一个连接最多可使用这么长时间,超时后连接会自动关闭(因为数据库本身可能也对NoActive连接设置了超时时间,我们的应对办法:定期ping,或者SetConnMaxLifetime)
    sqlDB.SetConnMaxLifetime(time.Hour)
    return db