golang-gorm自动建表问题

Lala ·
更新时间:2024-09-20
· 533 次阅读

目录

golang-gorm自动建表

定义结构体

定义变化的表名

实现interface

执行sql

判断是否有无

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) } 总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持软件开发网。



gorm golang

需要 登录 后方可回复, 如果你还没有账号请 注册新账号