gorm 连接与数据迁移

首页 / gorm / 正文

安装使用

  • 安装

    go get -u gorm.io/gorm
    go get -u gorm.io/driver/mysql
  • 使用

    // 引入这两个包
    import (
        "gorm.io/driver/mysql"
        "gorm.io/gorm"
    )
    • 连接数据库

      Dan: [username[:password]@][protocol[(address)]]/dbname[?param1=value1&...¶mN=valueN]

      用户名:密码@协议(ip:端口)/数据库名字?其他配置参数

      charset: 设置字符集

      parseTime: 格式化时间

      方式一:

      dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
        db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

      方式二:

      db, err := gorm.Open(mysql.New(mysql.Config{
              DSN: "root:root@tcp(127.0.0.1:8889)/test?utf8mb4=utf8&parseTime=True&loc=Local", // DSN data source name
              DefaultStringSize: 256, // string 类型字段的默认长度,如果设置的字符集是utf8mb4的,这里需要该为171
              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: "t_",   // 表名前缀,`User` 的表名应该是 `t_users`
                  SingularTable: true, // 使用单数表名,启用该选项,此时,`User` 的表名应该是 `t_user`
              },
              DisableForeignKeyConstraintWhenMigrating: true, // 创建表的时候是否创建外健约束
          })
          println(db, err)

迁移

  1. 自动迁移

    // 先创建一个结构体
    type User struct {
      Name string
    }
    // 执行自动迁移命令
    db.AutoMigrate(&User{})
    // 根据上边的配置,这里会自动创建一个t_users表名的表
  2. Migrator 接口

    • 获取当前连接的数据库

      fmt.Println(db.Migrator().CurrentDatabase()) //这里返回当前连接的库名
    • 创建表

      // 先创建一个结构体
      type User struct {
        Name string
      }
      db.Migrator().CreateTable(&User{})
      // 注意: 如果数据表存在则会提示Error 1050: Table 't_user' already exists
    • 判断表是否存在

      fmt.Println(db.Migrator().HasTable(&User{})) // 返回一个bool值,存在返回true 不存在返回false
    • 删除表

      fmt.Println(db.Migrator().DropTable(&Users{})) // 删除表
    • 重命名表

      type User struct {
        Name string
      }
      type Users struct {
        Name string
        age uint // 这里的字段并没有被迁移进去,仅仅是修改了表名
      }
      fmt.Println(db.Migrator().RenameTable(&User{}, &Users{}))
      
    • 给表中添加一个字段

      type User struct {
              Name string
              Age int
      }
      err := db.Migrator().AddColumn(&User{}, "Age")
    • 删除一个表中的字段

      db.Migrator().DropColumn(&User{}, "Age")
    • 修改表中字段的名称

      db.Migrator().AlterColumn(&User{}, "Name")
    • 检查表中的字段名是否存在

      db.Migrator().HasColumn(&User{}, "Name")
    • 重命名表中的字段

      _ = db.Migrator().RenameColumn(&User{}, "Name", "NewName")
打赏
评论区
头像