• GORM操作MySQL数据库-连接数据库以及对表的操作


    一、连接数据库:

        dsn := "root:123456@tcp(127.0.0.1:3306)/more?charset=utf8mb4&parseTime=True&loc=Local"
        db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
        if err != nil{
            return
        }

    账号:密码@tcp(127.0.0.1:3306)/库名

    二、迁移表

    package main
    
    import (
       "gorm.io/driver/mysql"
       "gorm.io/gorm"
       "time"
    )
    
    type User struct {
       ID int  字段名:大写开头!
       Name string
       CreatedTime time.Time
    }
    func main() {
       dsn := "root:123456@tcp(127.0.0.1:3306)/more?charset=utf8mb4&parseTime=True&loc=Local"
       db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
       if err != nil{
          return
       }
       db.AutoMigrate(&User{})
    }

     关于表名:GORM 将 struct name 复数snake_cases为表名,对于 struct User,其表名是users约定俗成的,

    测试一下

    
    type User struct {
        ID int
        Name string
        CreatedTime time.Time
    }
    type UserInfo struct {
        ID int
        Info string
    }
    
    func main() {
        dsn := "root:123456@tcp(127.0.0.1:3306)/more?charset=utf8mb4&parseTime=True&loc=Local"
        db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
        if err != nil{
            return
        }
        db.AutoMigrate(&User{})
        db.AutoMigrate(&UserInfo{})
    
    }

    自定义表名:实现Tabler接口

    例:

    
    type User struct {
        ID int
        Name string
        CreatedTime time.Time
    }
    type UserInfo struct {
        ID int
        Info string
    }
    
    func (UserInfo) TableName() string {
        return "infos"
    }
    
    func main() {
        dsn := "root:123456@tcp(127.0.0.1:3306)/more?charset=utf8mb4&parseTime=True&loc=Local"
        db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
        if err != nil{
            return
        }
        db.AutoMigrate(&User{})
        db.AutoMigrate(&UserInfo{})
    
    }

     还有一种方法自定义表名:

    
    type User struct {
        ID int
        Name string
        CreatedTime time.Time
    }
    type UserInfo struct {
        ID int
        Info string
    }
    
    func (UserInfo) TableName() string {
        return "infos"
    }
    
    func main() {
        dsn := "root:123456@tcp(127.0.0.1:3306)/more?charset=utf8mb4&parseTime=True&loc=Local"
        db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
        if err != nil{
            return
        }
        //db.AutoMigrate(&User{})
        //db.AutoMigrate(&UserInfo{})
        db.Table("info_table").AutoMigrate(&UserInfo{})
    
    }

    关于字段名:大写开头!

    type User struct {
    ID uint // column name is `id`
    Name string // column name is `name`
    Birthday time.Time // column name is `birthday`
    CreatedAt time.Time // column name is `created_at`
    }
    当然你也可以自定义
    type Animal struct {
    AnimalID int64 `gorm:"column:beast_id"` // set name to `beast_id`
    Birthday time.Time `gorm:"column:day_of_the_beast"` // set name to `day_of_the_beast`
    Age int64 `gorm:"column:age_of_the_beast"` // set name to `age_of_the_beast`
    }
    看起来无论表名还是字段名,GORM默认的规则都是比较合适的,命名比较规范的话,使用默认的即可。
    设置默认值:
    type User struct { 
      gorm.Model 
      Name string
       Age * int            `gorm:"default:18"`
       Active sql.NullBool `gorm:"default:true"`
     }

     三、关于字段的增删改

    1.增加字段

       直接在结构体添加即可

        AutoMigrate 将创建缺少外键、约束、列和索引的表。如果现有列的大小、精度、可为空值发生变化,它将更改现有列的类型。

    type User struct {
    ID int
    Name string
    Desc string
    CreatedTime time.Time
    }


    func main() {
    dsn := "root:123456@tcp(127.0.0.1:3306)/more?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil{
    return
    }
    db.AutoMigrate(&User{})

    }

    也可以

    // 添加名称字段
    db.Migrator().AddColumn(&User{}, "Name" ) 

    2.删除字段

             直接在结构体删除字段是无效的。这是因为AutoMigrate 不会删除未使用的列,保护您的数据。

    type User struct {
        ID int
        Name string
        CreatedTime time.Time
    }
    
    
    func main() {
        dsn := "root:123456@tcp(127.0.0.1:3306)/more?charset=utf8mb4&parseTime=True&loc=Local"
        db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
        if err != nil{
            return
        }
        db.AutoMigrate(&User{})
    
    }

    
    
    db.Migrator().DropColumn(&User{}, "Desc" ) 
    // 删除字段

     3.修改字段

        db.Migrator ().RenameColumn(&User{}, "name", "NameNew" )

     这里的名字好像没有按原始的那样。

        db.Migrator ().RenameColumn(&User{}, "Name", "name_new" )

  • 相关阅读:
    获得SQL语句的模板,自己写类似readtrace时候用
    我的HD2手机
    匹配symbols
    再送一次书
    微软急聘MOSS高手!
    邮件规则的实现
    System.Data.SQLClient.SqlConnection在Open之后为什么需要及时Close?
    windbg中无法加载mscorwks.dll, Win32 error 0n2
    Diablo3狗熊榜
    软件构架师的特点
  • 原文地址:https://www.cnblogs.com/qinghuaL/p/14843449.html
Copyright © 2020-2023  润新知