golang-gorm自動建表問題
golang-gorm自動建表
定義結(jié)構(gòu)體
設(shè)置主鍵、自增、和獨立索引
聯(lián)合索引用addindex
type User struct {
?? ?//通過在字段后面的標簽說明,定義golang字段和表字段的關(guān)系
?? ?//例如 `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"`
?? ?//創(chuàng)建時間,時間戳
?? ?CreateTime int64 `gorm:"column:createtime"`
}定義變化的表名
全局變量
var TablePre = "2021"
實現(xiàn)interface
func (u *User) TableName() string{
?? ?return "userss"+table
}執(zhí)行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表創(chuàng)建成功")
? ? } else {
? ? ? fmt.Println("balance表創(chuàng)建失敗")
? ? }
? } else {
? ? fmt.Println("表已存在")
? }GORM概述
官網(wǎng)文檔另人看的頭疼,還是記錄一些常用的api吧,基本都是復制官方文檔做些例子。
GORM給我最直觀的感受:程序員只需關(guān)系結(jié)構(gòu)體,操作結(jié)構(gòu)體,無需關(guān)注如何操作數(shù)據(jù)庫。
- 優(yōu)點:提高開發(fā)效率
- 缺點:使用反射犧牲性能,犧牲靈活性
GORM保護數(shù)據(jù)的安全,比如說結(jié)構(gòu)體刪除了某個字段,原來在數(shù)據(jù)庫中的表不會刪那個字段。結(jié)構(gòu)體指定改了表名,原來生成的表不會被刪除。其將有數(shù)據(jù)安全風險的可能全部規(guī)避掉,交由開發(fā)人員手動去篩查。
概述

- 數(shù)據(jù)表 <===> 結(jié)構(gòu)體
- 數(shù)據(jù)行 <===> 結(jié)構(gòu)體實例
- 字段 <===> 結(jié)構(gòu)體字段
快速入門
db.AutoMigrate(&UserInfo{}):意思是自動遷移,自動遷移為給定模型運行自動遷移,只會添加缺少的字段,不會刪除/更改當前數(shù)據(jù)。就是說如果結(jié)構(gòu)體加了新的字段,會給表也加上新字段。db.Create()傳遞一個結(jié)構(gòu)體,自動找到結(jié)構(gòu)體對應的表,并將結(jié)構(gòu)體的值作為一條記錄插入表中,可以傳指針或者非指針,都可以。db.First()傳遞一個結(jié)構(gòu)體的指針,自動找到結(jié)構(gòu)體對應的表,并將表中第一條記錄賦值給結(jié)構(gòu)體,必須因為指針。db.Find(out,where...)按照條件查詢,傳遞一個結(jié)構(gòu)體的指針,自動找到結(jié)構(gòu)體對應的表,并按照where中的條件查詢記錄,賦值給結(jié)構(gòu)體。還有很多查詢的語法,后續(xù)再說。db.Model().Update()傳遞一個查詢出來有值結(jié)構(gòu)體,通過Updata將其對應的字段更新,并傳遞到表中。db.Delete(&u)刪除傳遞進來的數(shù)據(jù)庫對應的記錄。
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, "旭飛", "女", "足球"}
// 創(chuàng)建記錄
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)
}
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
golang高并發(fā)系統(tǒng)限流策略漏桶和令牌桶算法源碼剖析
這篇文章主要介紹了golang高并發(fā)系統(tǒng)限流策略漏桶和令牌桶算法源碼剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06

