網站首頁 編程語言 正文
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) }
總結
原文鏈接:https://blog.csdn.net/qq_39787367/article/details/112567822
相關推薦
- 2024-03-20 解決(gyp、python等問題):gyp ERR! find VS msvs_version no
- 2021-12-15 Linux下Makefile的編寫與使用詳解_Linux
- 2022-03-06 Linux之Centos8創建CA證書教程_Linux
- 2023-07-02 如何遠程使用服務器上的Jupyter?notebook_python
- 2023-10-13 is using incorrect casing. Use PascalCase for Reac
- 2022-09-05 Shiro和Security的核心模塊以及兩者的區別
- 2022-03-15 linux系統中計劃任務介紹_Linux
- 2022-11-12 C語言數據結構之單鏈表的查找和建立_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支