开发者

golang-gorm自动建表问题

目录
  • golang-gorm自动建表
    • 定义结构体
    • 定义变化的表名
    • 实现interface
    • 执行sql
    • 判断是否有无
  • GORM概述
    • 概述
    • 快速入门
  • 总结

    golang-gorm自动建表

    定义结构体

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

    联合索引用addindex

    type User struct 编程{
     //通过在字段后面的标签说明,定义golang字段和表字段的关系
     //例如 `gorm:"column:username"` 标签说开发者_开发学习明含义是: mysql表的列名(字段名)为username
     //这里golang定义的Username变js量和MYSQL表字段username一样,他们的名字可以不一样。
     Id int64 `gorm:"column:username;not null;type:int(4) primary key auto_increment;comment:'用户名'"`
     Password string `gorm:"column:password;type:varchandroidar(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保护数据的安全,比如说结构体删除了某个字段,原来在数据库中的表不会删那个字段。结构体指定改了表名,原来生成的表不会被删除。其将有数据安全风险的可能全部规避掉,交由开发人员手动去筛查。

    概述

    golang-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.AutoMigrwww.devze.comate(&UserInfo{})
    
    	u1 := UserInfo{1, "武旭android飞", "男", "篮球"}
    	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)
    }
    

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜