本网站(662p.com)打包出售,且带程序代码数据,662p.com域名,程序内核采用TP框架开发,需要联系扣扣:2360248666 /wx:lianweikj
精品域名一口价出售:1y1m.com(350元) ,6b7b.com(400元) , 5k5j.com(380元) , yayj.com(1800元), jiongzhun.com(1000元) , niuzen.com(2800元) , zennei.com(5000元)
需要联系扣扣:2360248666 /wx:lianweikj
golang-gorm自动建表问题
ggliuwei · 152浏览 · 发布于2023-02-17 +关注

这篇文章主要介绍了golang-gorm自动建表问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

golang-gorm自动建表

定义结构体

设置主键、自增、和独立索引

联合索引用addindex

type User struct {
    //通过在字段后面的标签说明,定义golang字段和表字段的关系
    //例如 `gorm:"column:username"` 标签说明含义是: Mysql表的列名(字段名)为username
    //这里golang定义的Username变量和MYSQL表字段username一样,他们的名字可以不一样。
    Id int64 `gorm:"column:username;
    not null;type:int(4) primary key auto_increment;comment:'用户名'"`
    Password string `gorm:"column:password;type:varchar(30);index:idx_name"`
    //创建时间,时间戳
    CreateTime int64 `gorm:"column:createtime"`
}

定义变化的表名

全局变量

var TablePre = "2021"

实现interface

func (u *User) TableName() string{
    return "userss"+table
}

执行sql

dbSlaveClient, err := gorm.GetClient(xxxx)
    if err != nil {
        fmt.Println(err)
    }
     TablePre = "20210"
    err = dbSlaveClient.Model(&User{}).Debug().
        AutoMigrate(&User{}).
        AddIndex("idx_cr_pass","createtime","password").Error

判断是否有无

if !dbSlaveClient.HasTable(&User{}) {
    dbSlaveClient.AutoMigrate(&User{})
    if dbSlaveClient.HasTable(&User{}) {
      fmt.Println("balance表创建成功")
    } else {
      fmt.Println("balance表创建失败")
    }
  } else {
    fmt.Println("表已存在")
  }

GORM概述

官网文档另人看的头疼,还是记录一些常用的api吧,基本都是复制官方文档做些例子。

GORM给我最直观的感受:程序员只需关系结构体,操作结构体,无需关注如何操作数据库。

  • 优点:提高开发效率

  • 缺点:使用反射牺牲性能,牺牲灵活性

GORM保护数据的安全,比如说结构体删除了某个字段,原来在数据库中的表不会删那个字段。结构体指定改了表名,原来生成的表不会被删除。其将有数据安全风险的可能全部规避掉,交由开发人员手动去筛查。

概述

在这里插入图片描述

  • 数据表 <===> 结构体

  • 数据行 <===> 结构体实例

  • 字段  <===> 结构体字段

快速入门

  • db.AutoMigrate(&UserInfo{}):意思是自动迁移,自动迁移为给定模型运行自动迁移,只会添加缺少的字段,不会删除/更改当前数据。就是说如果结构体加了新的字段,会给表也加上新字段。

  • db.Create()传递一个结构体,自动找到结构体对应的表,并将结构体的值作为一条记录插入表中,可以传指针或者非指针,都可以。

  • db.First()传递一个结构体的指针,自动找到结构体对应的表,并将表中第一条记录赋值给结构体,必须因为指针。

  • db.Find(out,where...)按照条件查询,传递一个结构体的指针,自动找到结构体对应的表,并按照where中的条件查询记录,赋值给结构体。还有很多查询的语法,后续再说。

  • db.Model().Update()传递一个查询出来有值结构体,通过Updata将其对应的字段更新,并传递到表中。

  • db.Delete(&u)删除传递进来的数据库对应的记录。

package main
 import (
    "fmt"
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
)
 // UserInfo 用户信息
type UserInfo struct {
    ID     uint
    Name   string
    Gender string
    Hobby  string
}
 func main() {
    db, err := gorm.Open
    ("mysql", "root:123456@tcp(127.0.0.1:3306)/gormDB?charset=utf8mb4&parseTime=True&loc=Local")
    if err != nil {
        panic(err)
    }
    defer db.Close()
     // 自动迁移
    db.AutoMigrate(&UserInfo{})
     u1 := UserInfo{1, "武旭飞", "男", "篮球"}
    u2 := UserInfo{2, "旭飞", "女", "足球"}
    // 创建记录
    db.Create(&u1)
    db.Create(&u2)
    // 查询第一条记录
    var u = new(UserInfo)
    db.First(&u)
    fmt.Printf("%#v\n", u)
    // 按条件查询
    var uu UserInfo
    db.Find(&uu, "hobby=?", "足球")
    fmt.Printf("%#v\n", uu)
    // 更新
    db.Model(&u).Update("hobby", "双色球")
    // 删除
    db.Delete(&u)
}


相关推荐

PHP实现部分字符隐藏

沙雕mars · 1325浏览 · 2019-04-28 09:47:56
Java中ArrayList和LinkedList区别

kenrry1992 · 908浏览 · 2019-05-08 21:14:54
Tomcat 下载及安装配置

manongba · 970浏览 · 2019-05-13 21:03:56
JAVA变量介绍

manongba · 962浏览 · 2019-05-13 21:05:52
什么是SpringBoot

iamitnan · 1086浏览 · 2019-05-14 22:20:36
加载中

0评论

评论
分类专栏
小鸟云服务器
扫码进入手机网页